Preparation

Clean the environment.

Set locations, and the working directory.

A package-installation function.

Load those packages.

We will create a datestamp and define the Utrecht Science Park Colour Scheme.

# Function to grep data from glm()/lm()
GLM.CON <- function(fit, DATASET, x_name, y, verbose=c(TRUE,FALSE)){
  cat("Analyzing in dataset '", DATASET ,"' the association of '", x_name ,"' with '", y ,"' .\n")
  if (nrow(summary(fit)$coefficients) == 1) {
    output = c(DATASET, x_name, y, rep(NA,8))
    cat("Model not fitted; probably singular.\n")
  }else {
    cat("Collecting data.\n\n")
    effectsize = summary(fit)$coefficients[2,1]
    SE = summary(fit)$coefficients[2,2]
    OReffect = exp(summary(fit)$coefficients[2,1])
    CI_low = exp(effectsize - 1.96 * SE)
    CI_up = exp(effectsize + 1.96 * SE)
    tvalue = summary(fit)$coefficients[2,3]
    pvalue = summary(fit)$coefficients[2,4]
    R = summary(fit)$r.squared
    R.adj = summary(fit)$adj.r.squared
    sample_size = nrow(model.frame(fit))
    AE_N = AEDB.CEA.samplesize
    Perc_Miss = 100 - ((sample_size * 100)/AE_N)
    
    output = c(DATASET, x_name, y, effectsize, SE, OReffect, CI_low, CI_up, tvalue, pvalue, R, R.adj, AE_N, sample_size, Perc_Miss)
    
    if (verbose == TRUE) {
    cat("We have collected the following and summarize it in an object:\n")
    cat("Dataset...................:", DATASET, "\n")
    cat("Score/Exposure/biomarker..:", x_name, "\n")
    cat("Trait/outcome.............:", y, "\n")
    cat("Effect size...............:", round(effectsize, 6), "\n")
    cat("Standard error............:", round(SE, 6), "\n")
    cat("Odds ratio (effect size)..:", round(OReffect, 3), "\n")
    cat("Lower 95% CI..............:", round(CI_low, 3), "\n")
    cat("Upper 95% CI..............:", round(CI_up, 3), "\n")
    cat("T-value...................:", round(tvalue, 6), "\n")
    cat("P-value...................:", signif(pvalue, 8), "\n")
    cat("R^2.......................:", round(R, 6), "\n")
    cat("Adjusted r^2..............:", round(R.adj, 6), "\n")
    cat("Sample size of AE DB......:", AE_N, "\n")
    cat("Sample size of model......:", sample_size, "\n")
    cat("Missing data %............:", round(Perc_Miss, 6), "\n")
    } else {
      cat("Collecting data in summary object.\n")
    }
  }
  return(output)
  print(output)
}

GLM.BIN <- function(fit, DATASET, x_name, y, verbose=c(TRUE,FALSE)){
  cat("Analyzing in dataset '", DATASET ,"' the association of '", x_name ,"' with '", y ,"' ...\n")
  if (nrow(summary(fit)$coefficients) == 1) {
    output = c(DATASET, x_name, y, rep(NA,9))
    cat("Model not fitted; probably singular.\n")
  }else {
    cat("Collecting data...\n")
    effectsize = summary(fit)$coefficients[2,1]
    SE = summary(fit)$coefficients[2,2]
    OReffect = exp(summary(fit)$coefficients[2,1])
    CI_low = exp(effectsize - 1.96 * SE)
    CI_up = exp(effectsize + 1.96 * SE)
    zvalue = summary(fit)$coefficients[2,3]
    pvalue = summary(fit)$coefficients[2,4]
    dev <- fit$deviance
    nullDev <- fit$null.deviance
    modelN <- length(fit$fitted.values)
    R.l <- 1 - dev / nullDev
    R.cs <- 1 - exp(-(nullDev - dev) / modelN)
    R.n <- R.cs / (1 - (exp(-nullDev/modelN)))
    sample_size = nrow(model.frame(fit))
    AE_N = AEDB.CEA.samplesize
    Perc_Miss = 100 - ((sample_size * 100)/AE_N)
    
    output = c(DATASET, x_name, y, effectsize, SE, OReffect, CI_low, CI_up, zvalue, pvalue, R.l, R.cs, R.n, AE_N, sample_size, Perc_Miss)
    if (verbose == TRUE) {
    cat("We have collected the following and summarize it in an object:\n")
    cat("Dataset...................:", DATASET, "\n")
    cat("Score/Exposure/biomarker..:", x_name, "\n")
    cat("Trait/outcome.............:", y, "\n")
    cat("Effect size...............:", round(effectsize, 6), "\n")
    cat("Standard error............:", round(SE, 6), "\n")
    cat("Odds ratio (effect size)..:", round(OReffect, 3), "\n")
    cat("Lower 95% CI..............:", round(CI_low, 3), "\n")
    cat("Upper 95% CI..............:", round(CI_up, 3), "\n")
    cat("Z-value...................:", round(zvalue, 6), "\n")
    cat("P-value...................:", signif(pvalue, 8), "\n")
    cat("Hosmer and Lemeshow r^2...:", round(R.l, 6), "\n")
    cat("Cox and Snell r^2.........:", round(R.cs, 6), "\n")
    cat("Nagelkerke's pseudo r^2...:", round(R.n, 6), "\n")
    cat("Sample size of AE DB......:", AE_N, "\n")
    cat("Sample size of model......:", sample_size, "\n")
    cat("Missing data %............:", round(Perc_Miss, 6), "\n")
    } else {
      cat("Collecting data in summary object.\n")
    }
  }
  return(output)
  print(output)
}

Background

Using a Mendelian Randomization approach, we recently examined associations between the circulating levels of 41 cytokines and growth factors and the risk of stroke in the MEGASTROKE GWAS dataset (67,000 stroke cases and 450,000 controls) and found Monocyte chemoattractant protein-1 (MCP-1) as the cytokine showing the strongest association with stroke, particularly large artery and cardioembolic stroke (Georgakis et al., 2019a). Genetically elevated MCP-1 levels were also associated with a higher risk of coronary artery disease and myocardial infarction (Georgakis et al., 2019a). Further, in a meta-analysis of 6 observational population-based of longitudinal cohort studies we recently showed that baseline levels of MCP-1 were associated with a higher risk of ischemic stroke over follow-up (Georgakis et al., 2019b). While these data suggest a central role of MCP-1 in the pathogenesis of atherosclerosis, it remains unknown if MCP-1 levels in the blood really reflect MCP-1 activity. MCP-1 is expressed in the atherosclerotic plaque and attracts monocytes in the subendothelial space (Nelken et al., 1991; Papadopoulou et al., 2008; Takeya et al., 1993; Wilcox et al., 1994). Thus, MCP-1 levels in the plaque might more strongly reflect MCP-1 signaling. However, it remains unknown if MCP-1 plaque levels associate with plaque vulnerability or risk of cardiovascular events.

Objectives

Against this background we now aim to make use of the data from Athero-Express Biobank Study to explore the associations of MCP-1 protein levels in the atherosclerotic plaques from patients undergoing carotid endarterectomy with phenotypes of plaque vulnerability and secondary vascular events over a follow-up of three years.

Methods

Blood

OLINK-platform

  • IL6: Interleukin 6. Entrez Gene: 3569. OLINK, plasma
  • MCP1: Monocyte chemotactic protein 1, MCP-1 (Chemokine (C-C motif) ligand 2, CCL2). Entrez Gene: 6347. OLINK, plasma

THESE DATA ARE NOT AVAILABLE YET

Plaque

Luminex-platform, measured by Luminex

  • MCP1: Monocyte chemotactic protein 1 (a.k.a. CCL2; Entrez Gene: 6347) concentration in plaque [pg/ug]. Measured in two experiments, variables MCP1 and MCP1_pg_ug_2015. The latter was corrected for plaque total protein concentration.
  • IL6: Interleuking 6 (IL6; Entrez Gene: 3569) concentration in plaque [pg/ug].
  • IL6R: Interleuking 6 receptor (IL6R; Entrez Gene: 3570) concentration in plaque [pg/ug].

FACS platform

  • IL6: Interleukin 6. Entrez Gene: 3569. Bender MedSystems; cat.nr.: BMS810FF. Recalculated FACS. [pg/mL]

Loading data

Clinical data

Loading Athero-Express clinical data.

require(haven)

AEDB <- haven::read_sav(paste0(AEDB_loc, "/2019-3NEW_AtheroExpressDatabase_ScientificAE_02072019_IC_added.sav"))

head(AEDB)

require(openxlsx)
Loading required package: openxlsx
AEDB_ProtConc <- openxlsx::read.xlsx(paste0(AEDB_loc, "/_Vriezer/20190919_Freezers_preTCBio.xlsx"), 
                                     sheet = "ProteinConc.", 
                                     skipEmptyCols = TRUE)

AEDB_Blood <- openxlsx::read.xlsx(paste0(AEDB_loc, "/_Vriezer/20190919_Freezers_preTCBio.xlsx"), 
                                     sheet = "Blood", 
                                     skipEmptyCols = TRUE)
AEDB_Plaque <- openxlsx::read.xlsx(paste0(AEDB_loc, "/_Vriezer/20190919_Freezers_preTCBio.xlsx"), 
                                     sheet = "Plaque", 
                                     skipEmptyCols = TRUE)

head(AEDB_ProtConc)
head(AEDB_Blood)
head(AEDB_Plaque)
NA
NA

Loading Athero-Express plaque protein measurements from 2015.

library(openxlsx)
AEDB_Protein_2015 <- openxlsx::read.xlsx(paste0(AEDB_loc, "/_AE_Proteins/Cytokines_and_chemokines_2015/20200629_MPCF015-0024.xlsx"), sheet = "for_SPSS_R")

names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "SampleID"] <- "STUDY_NUMBER"

head(AEDB_Protein_2015)

We will merge these measurements to the AEDB for comparing pg/ug vs. pg/mL measurements of MCP1 - also in relation to plaque phenotypes. In addition we have more information the experiment and can correct for this.

names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "IL6_pg_ml"] <- "IL6_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "IL6R_pg_ml"] <- "IL6R_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "IL8_pg_ml"] <- "IL8_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "MCP1_pg_ml"] <- "MCP1_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "RANTES_pg_ml"] <- "RANTES_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "PAI1_pg_ml"] <- "PAI1_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "MCSF_pg_ml"] <- "MCSF_pg_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "Adiponectin_ng_ml"] <- "Adiponectin_ng_ml_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "Segment_isolated_Tris"] <- "Segment_isolated_Tris_2015"
names(AEDB_Protein_2015)[names(AEDB_Protein_2015) == "Tris_protein_conc_ug_ml"] <- "Tris_protein_conc_ug_ml_2015"

temp <- subset(AEDB_Protein_2015, select = c("STUDY_NUMBER", "IL6_pg_ml_2015", "IL6R_pg_ml_2015", "IL8_pg_ml_2015", "MCP1_pg_ml_2015", "RANTES_pg_ml_2015", "PAI1_pg_ml_2015", "MCSF_pg_ml_2015", "Adiponectin_ng_ml_2015", "Segment_isolated_Tris_2015", "Tris_protein_conc_ug_ml_2015"))

AEDB <- merge(AEDBraw, temp, by.x = "STUDY_NUMBER", by.y = "STUDY_NUMBER", sort = FALSE,
              all.x = TRUE)
rm(temp)

temp <- subset(AEDB, select = c("STUDY_NUMBER", "MCP1", "MCP1_pg_ug_2015", "MCP1_pg_ml_2015", "Segment_isolated_Tris_2015"))

head(temp)
   

Examine AEDB

We can examine the contents of the Athero-Express Biobank dataset to know what each variable is called, what class (type) it has, and what the variable description is.

There is an excellent post on this: https://www.r-bloggers.com/working-with-spss-labels-in-r/.

AEDB %>% sjPlot::view_df(show.type = TRUE,
                         show.frq = TRUE,
                         show.prc = TRUE,
                         show.na = TRUE, 
                         max.len = TRUE, 
                         wrap.labels = 20,
                         verbose = FALSE, 
                         use.viewer = FALSE,
                         file = paste0(OUT_loc, "/", Today, ".AEDB.dictionary.html")) 

Fixing and creating variables

We need to be very strict in defining symptoms. Therefore we will fix a new variable that groups symptoms at inclusion.

Coding of symptoms is as follows:

  • missing -999
  • Asymptomatic 0
  • TIA 1
  • minor stroke 2
  • Major stroke 3
  • Amaurosis fugax 4
  • Four vessel disease 5
  • Vertebrobasilary TIA 7
  • Retinal infarction 8
  • Symptomatic, but aspecific symtoms 9
  • Contralateral symptomatic occlusion 10
  • retinal infarction 11
  • armclaudication due to occlusion subclavian artery, CEA needed for bypass 12
  • retinal infarction + TIAs 13
  • Ocular ischemic syndrome 14
  • ischemisch glaucoom 15
  • subclavian steal syndrome 16
  • TGA 17

We will group as follows in Symptoms.5G:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13
  3. Stroke > 2, 3
  4. Ocular > 4, 14, 15
  5. Retinal infarction > 8, 11
  6. Other > 5, 9, 10, 12, 16, 17

We will also group as follows in AsymptSympt:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13 + Stroke > 2, 3
  3. Ocular > 4, 14, 15 + Retinal infarction > 8, 11 + Other > 5, 9, 10, 12, 16, 17

We will also group as follows in AsymptSympt2G:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13 + Stroke > 2, 3 Ocular > 4, 14, 15 + Retinal infarction > 8, 11 + Other > 5, 9, 10, 12, 16, 17
# Fix symptoms
attach(AEDB)
# Symptoms.5G
AEDB[,"Symptoms.5G"] <- NA
AEDB$Symptoms.5G[sympt == 0] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"

# AsymptSympt
AEDB[,"AsymptSympt"] <- NA
AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
# 
# rm(AEDB.temp)

We will also fix the plaquephenotypes variable.

Coding of symptoms is as follows:

  • missing -999
  • not relevant -888
  • fibrous 1
  • fibroatheromatous 2
  • atheromatous 3

# Fix plaquephenotypes
attach(AEDB)
AEDB[,"OverallPlaquePhenotype"] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the diabetes status variable. We define diabetes as history of a diagnosis and/or use of glucose-lowering medications.


# Fix diabetes
attach(AEDB)
AEDB[,"DiabetesStatus"] <- NA
AEDB$DiabetesStatus[DM.composite == -999] <- NA
AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the smoking status variable. We are interested in whether someone never, ever or is currently (at the time of inclusion) smoking. This is based on the questionnaire.

  • diet801: are you a smoker?
  • diet802: did you smoke in the past?

We already have some variables indicating smoking status:

  • SmokingReported: patient has reported to smoke.
  • SmokingYearOR: smoking in the year of surgery?
  • SmokerCurrent: currently smoking?
require(labelled)
AEDB$diet801 <- to_factor(AEDB$diet801)
AEDB$diet802 <- to_factor(AEDB$diet802)
AEDB$diet805 <- to_factor(AEDB$diet805)
AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)

# table(AEDB$diet801)
# table(AEDB$diet802)
# table(AEDB$SmokingReported)
# table(AEDB$SmokerCurrent)
# table(AEDB$SmokingYearOR)
# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
# 
# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))

cat("\nFixing smoking status.\n")
attach(AEDB)
AEDB[,"SmokerStatus"] <- NA
AEDB$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
detach(AEDB)

cat("\n* Current smoking status.\n")
table(AEDB$SmokerCurrent,
      useNA = "ifany", 
      dnn = c("Current smoker"))

cat("\n* Updated smoking status.\n")
table(AEDB$SmokerStatus,
      useNA = "ifany", 
      dnn = c("Updated smoking status"))

cat("\n* Comparing to 'SmokerCurrent'.\n")
table(AEDB$SmokerStatus, AEDB$SmokerCurrent, 
      useNA = "ifany", 
      dnn = c("Updated smoking status", "Current smoker"))

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the alcohol status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"AlcoholUse"] <- NA
AEDB$AlcoholUse[diet810 == -999] <- NA
AEDB$AlcoholUse[diet810 == 0] <- "No"
AEDB$AlcoholUse[diet810 == 1] <- "Yes"
detach(AEDB)

table(AEDB$AlcoholUse)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix a history of CAD, stroke or peripheral intervention status variable. This will be based on CAD_history, Stroke_history, and Peripheral.interv


# Fix diabetes
attach(AEDB)
AEDB[,"MedHx_CVD"] <- NA
AEDB$MedHx_CVD[CAD_history == 0 | Stroke_history == 0 | Peripheral.interv == 0] <- "No"
AEDB$MedHx_CVD[CAD_history == 1 | Stroke_history == 1 | Peripheral.interv == 1] <- "yes"
detach(AEDB)

table(AEDB$CAD_history)
table(AEDB$Stroke_history)
table(AEDB$Peripheral.interv)
table(AEDB$MedHx_CVD)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

Athero-Express Biobank Study

Baseline characteristics

We are interested in the following variables at baseline.

  • Age (years)
  • Female sex (N, %)
  • Hypertension (N, %)
  • SBP (mmHg)
  • DBP (mmHg)
  • Diabetes mellitus (N, %)
  • Total cholesterol levels (mg/dL)
  • LDL cholesterol levels (mg/dL)
  • HDL cholesterol levels (mg/dL)
  • Triglyceride levels (mg/dL)
  • Use of statins (N, %)
  • Use of antiplatelet drugs (N, %)
  • BMI (kg/m²)
  • Smoking status (N, %)
    • Never smokers
    • Ex-smokers
    • Current smokers
  • History of CAD (N, %)
  • History of PAD (N, %)
  • Clinical manifestations
    • Asymptomatic
    • Amaurosis fugax
    • TIA
    • Stroke
  • eGFR (mL/min/1.73 m²)
  • MCP-1 plaque levels (pg/mL) (LUMINEX based, two experiments MCP1, and MCP1_pg_ug_2015)

NOT AVAILABLE YET - MCP-1 plasma levels (pg/mL) (OLINK based)

sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-apple-darwin19.4.0 (64-bit)
Running under: macOS Catalina 10.15.4

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /usr/local/Cellar/openblas/0.3.9/lib/libopenblasp-r0.3.9.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] GGally_1.5.0               PerformanceAnalytics_2.0.4 xts_0.12-0                 zoo_1.8-8                  ggcorrplot_0.1.3.999      
 [6] Hmisc_4.4-0                Formula_1.2-3              lattice_0.20-41            survminer_0.4.6            survival_3.1-12           
[11] labelled_2.4.0             openxlsx_4.1.5             ggpubr_0.3.0               tableone_0.11.1            haven_2.3.0               
[16] devtools_2.3.0             usethis_1.6.1              MASS_7.3-51.6              DT_0.13                    knitr_1.28                
[21] forcats_0.5.0              stringr_1.4.0              purrr_0.3.4                tibble_3.0.1               ggplot2_3.3.0             
[26] tidyverse_1.3.0            data.table_1.12.8          naniar_0.5.1               tidyr_1.1.0                dplyr_0.8.5               
[31] optparse_1.6.6             readr_1.3.1               

loaded via a namespace (and not attached):
  [1] readxl_1.3.1        backports_1.1.7     plyr_1.8.6          splines_3.6.3       crosstalk_1.1.0.1   inline_0.3.15      
  [7] digest_0.6.25       htmltools_0.4.0     fansi_0.4.1         magrittr_1.5        checkmate_2.0.0     memoise_1.1.0      
 [13] cluster_2.1.0       remotes_2.1.1       modelr_0.1.8        matrixStats_0.56.0  prettyunits_1.1.1   jpeg_0.1-8.1       
 [19] colorspace_1.4-1    rvest_0.3.5         mitools_2.4         xfun_0.14           callr_3.4.3         crayon_1.3.4       
 [25] jsonlite_1.6.1      glue_1.4.1          gtable_0.3.0        car_3.0-8           pkgbuild_1.0.8      rstan_2.19.3       
 [31] abind_1.4-5         scales_1.1.1        DBI_1.1.0           rstatix_0.5.0.999   Rcpp_1.0.4.6        xtable_1.8-4       
 [37] htmlTable_1.13.3    foreign_0.8-75      km.ci_0.5-2         stats4_3.6.3        StanHeaders_2.19.2  survey_4.0         
 [43] htmlwidgets_1.5.1   httr_1.4.1          getopt_1.20.3       RColorBrewer_1.1-2  acepack_1.4.1       ellipsis_0.3.1     
 [49] reshape_0.8.8       pkgconfig_2.0.3     loo_2.2.0           farver_2.0.3        nnet_7.3-14         dbplyr_1.4.3       
 [55] tidyselect_1.1.0    labeling_0.3        rlang_0.4.6         reshape2_1.4.4      munsell_0.5.0       cellranger_1.1.0   
 [61] cli_2.0.2           generics_0.0.2      broom_0.5.6         yaml_2.2.1          processx_3.4.2      fs_1.4.1           
 [67] zip_2.0.4           survMisc_0.5.5      packrat_0.5.0       visdat_0.5.3        nlme_3.1-148        xml2_1.3.2         
 [73] compiler_3.6.3      rstudioapi_0.11     curl_4.3            png_0.1-7           e1071_1.7-3         testthat_2.3.2     
 [79] ggsignif_0.6.0      reprex_0.3.0        stringi_1.4.6       ps_1.3.3            desc_1.2.0          Matrix_1.2-18      
 [85] KMsurv_0.1-5        vctrs_0.3.0         pillar_1.4.4        lifecycle_0.2.0     R6_2.4.1            latticeExtra_0.6-29
 [91] gridExtra_2.3       rio_0.5.16          sessioninfo_1.1.1   assertthat_0.2.1    pkgload_1.0.2       rprojroot_1.3-2    
 [97] withr_2.2.0         parallel_3.6.3      hms_0.5.3           quadprog_1.5-8      grid_3.6.3          rpart_4.1-15       
[103] class_7.3-17        carData_3.0-4       lubridate_1.7.8     base64enc_0.1-3    

All patients

Showing the baseline table of the whole Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]

CEA patients

Showing the baseline table of the CEA patients in the Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]

CEA patients with MCP1_pg_ug_2015

Showing the baseline table of the CEA patients in the Athero-Express Biobank with MCP1_pg_ug_2015.

AEDB.CEA.subset <- subset(AEDB.CEA, !is.na(MCP1_pg_ug_2015))

AEDB.CEA.subset.AsymptSympt.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         strata = "AsymptSympt2G",
                                         data = AEDB.CEA.subset, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:6]

CEA patients with MCP1_pg_ug_2015 and MCP1

Showing the baseline table of the CEA patients in the Athero-Express Biobank with MCP1_pg_ug_2015 and MCP1.


AEDB.CEA.subset.combo <- subset(AEDB.CEA, !is.na(MCP1_pg_ug_2015) | !is.na(MCP1))

AEDB.CEA.subset.combo.tableOne = print(CreateTableOne(vars = basetable_vars,
                                         # factorVars = basetable_bin,
                                         strata = "AsymptSympt2G",
                                         data = AEDB.CEA.subset.combo, includeNA = TRUE),
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
                          format = "pf",
                          contDigits = 3)[,1:6]

CEA patients with plasma MCP1 levels

Showing the baseline table of the CEA patients in the Athero-Express Biobank with plasma MCP1 levels.

NOT AVAILABLE YET

AEDB.CEA.subset.plasma <- subset(AEDB.CEA, !is.na(MCP1_plasma))

AEDB.CEA.subset.plasma.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         strata = "AsymptSympt2G",
                                         data = AEDB.CEA.subset.plasma, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:6]

CEA patients with plasma and plaque MCP1 levels

Showing the baseline table of the CEA patients in the Athero-Express Biobank with both plasma and plaque MCP1 levels.

NOT AVAILABLE YET

AEDB.CEA.subset.both <- subset(AEDB.CEA, !is.na(MCP1_pg_ug_2015) & !is.na(MCP1))

AEDB.CEA.subset.both.tableOne = print(CreateTableOne(vars = basetable_vars,
                                         # factorVars = basetable_bin,
                                         strata = "AsymptSympt2G",
                                         data = AEDB.CEA.subset.both, includeNA = TRUE),
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE,
                          format = "pf",
                          contDigits = 3)[,1:6]

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.wholeCEA.xlsx"),
           AEDB.CEA.tableOne, 
           row.names = TRUE, 
           col.names = TRUE, 
           sheetName = "wholeAEDB_Baseline")

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.subsetCEA.xlsx"),
           AEDB.CEA.subset.tableOne, 
           row.names = TRUE, 
           col.names = TRUE, 
           sheetName = "subsetAEDB_Baseline")

write.xlsx(file = paste0(BASELINE_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.subsetCEAserum.xlsx"),
           AEDB.CEA.subset.serum.tableOne, 
           row.names = TRUE, 
           col.names = TRUE, 
           sheetName = "subsetAEDB_Baseline_serum")

Data exploration

Here we inspect the data and when necessary transform quantitative measures. We will inspect the raw, natural log transformed + the smallest measurement, and inverse-normal transformation.

MCP1 plaque levels: experiment 2

We will explore the plaque levels. As noted above, we will use MCP1_pg_ug_2015, this was experiment 2 in 2015 on the LUMINEX-platform and measurements were corrected for total plaque protein content.


summary(AEDB.CEA$MCP1_pg_ug_2015)

do.call(rbind , by(AEDB.CEA$MCP1_pg_ug_2015, AEDB.CEA$AsymptSympt2G, summary))


summary(AEDB.CEA$MCP1_pg_ml_2015)

do.call(rbind , by(AEDB.CEA$MCP1_pg_ml_2015, AEDB.CEA$AsymptSympt2G, summary))
library(patchwork)
p1 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ug_2015", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    title = "MCP1 plaque levels",
                    xlab = "pg/ug", 
                    ggtheme = theme_minimal())

min_MCP1_pg_ug_2015 <- min(AEDB.CEA$MCP1_pg_ug_2015, na.rm = TRUE)
min_MCP1_pg_ug_2015

AEDB.CEA$MCP1_pg_ug_2015_LN <- log(AEDB.CEA$MCP1_pg_ug_2015 + min_MCP1_pg_ug_2015)
p2 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ug_2015_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    # title = "MCP1 plaque levels",
                    xlab = "natural log-transformed pg/ug", 
                    ggtheme = theme_minimal())

AEDB.CEA$MCP1_pg_ug_2015_rank <- qnorm((rank(AEDB.CEA$MCP1_pg_ug_2015, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$MCP1_pg_ug_2015)))
p3 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ug_2015_rank",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = "MCP1 plaque levels",
                    xlab = "inverse-normal transformation pg/ug",
                    ggtheme = theme_minimal())

p1 
p2 
p3
# ggpar(p1, legend = "") / ggpar(p2, legend = "")  | ggpar(p3, legend = "right")

rm(p1, p2, p3)

We will explore the MCP1_pg_ml_2015 levels and compare to the protein content corrected ones.

library(patchwork)
p1 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ml_2015", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    title = "MCP1 plaque levels",
                    xlab = "pg/mL", 
                    ggtheme = theme_minimal())

min_MCP1_pg_ml_2015 <- min(AEDB.CEA$MCP1_pg_ml_2015, na.rm = TRUE)
min_MCP1_pg_ml_2015

AEDB.CEA$MCP1_pg_ml_2015_LN <- log(AEDB.CEA$MCP1_pg_ml_2015 + min_MCP1_pg_ml_2015)
p2 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ml_2015_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    # title = "MCP1 plaque levels",
                    xlab = "natural log-transformed pg/mL", 
                    ggtheme = theme_minimal())

AEDB.CEA$MCP1_pg_ml_2015_rank <- qnorm((rank(AEDB.CEA$MCP1_pg_ml_2015, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$MCP1_pg_ml_2015)))
p3 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_pg_ml_2015_rank",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = "MCP1 plaque levels",
                    xlab = "inverse-normal transformation pg/mL",
                    ggtheme = theme_minimal())

p1 
p2 
p3
# ggpar(p1, legend = "") / ggpar(p2, legend = "")  | ggpar(p3, legend = "right")

rm(p1, p2, p3)

MCP1 plaque levels: experiment 1

We will explore the plaque levels. As noted above, we will use MCP1, this was experiment 1 on the LUMINEX-platform and measurements were corrected for total plaque protein content.


# summary(AEDB.CEA$MCP1)
# 
# do.call(rbind , by(AEDB.CEA$MCP1, AEDB.CEA$AsymptSympt2G, summary))
# 
# attach(AEDB.CEA)
AEDB.CEA$MCP1[MCP1 == 0] <- NA
# detach(AEDB.CEA)

summary(AEDB.CEA$MCP1)

do.call(rbind , by(AEDB.CEA$MCP1, AEDB.CEA$AsymptSympt2G, summary))
p1 <- ggpubr::gghistogram(AEDB.CEA, "MCP1", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    title = "MCP1 plaque levels",
                    xlab = "pg/mL", 
                    ggtheme = theme_minimal())

min_MCP1 <- min(AEDB.CEA$MCP1, na.rm = TRUE)
min_MCP1

AEDB.CEA$MCP1_LN <- log(AEDB.CEA$MCP1 + min_MCP1)
p2 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    # add = "mean", 
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2), 
                    title = "MCP1 plaque levels",
                    xlab = "natural log-transformed pg/ug", 
                    ggtheme = theme_minimal())

AEDB.CEA$MCP1_rank <- qnorm((rank(AEDB.CEA$MCP1, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$MCP1)))
p3 <- ggpubr::gghistogram(AEDB.CEA, "MCP1_rank",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = "MCP1 plaque levels",
                    xlab = "inverse-normal transformation pg/ug",
                    ggtheme = theme_minimal())

p1 
p2 
p3
# ggpar(p1, legend = "") / ggpar(p2, legend = "")  | ggpar(p3, legend = "right")

rm(p1, p2, p3)

Correlations between MCP1 plaque levels and transformations

Here we compare the MCP1 plaque levels from experiment 1 with those experiment 2. The latter we measured in pg/mL and also corrected for the total protein content (pg/ug).

p1 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "MCP1_rank", 
                        y = "MCP1_pg_ml_2015_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "experiment 1",
                        ylab = "experiment 2",
                        title = "MCP1 plaque levels, INT, [pg/mL]",
                        ggtheme = theme_minimal())

p1 

p2 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "MCP1_rank", 
                        y = "MCP1_pg_ug_2015_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "experiment 1",
                        ylab = "experiment 2",
                        title = "MCP1 plaque levels, INT, [pg/mL]/[pg/ug]",
                        ggtheme = theme_minimal())

p2 

p3 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "MCP1_pg_ml_2015_rank", 
                        y = "MCP1_pg_ug_2015_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "experiment 2, [pg/mL]",
                        ylab = "experiment 2, [pg/ug]",
                        title = "MCP1 plaque levels, INT",
                        ggtheme = theme_minimal())

p3

MCP1 plasma levels

NOT AVAILABLE YET

Preliminary conclusion data exploration

In line with the previous work by Marios Georgakis we will apply natural log transformation on all proteins and focus the analysis on MCP1 in plasma and plaque.

Analyses

The analyses are focused on three elements:

  1. plaque vulnerability phenotypes
  2. clinical status at inclusion (symptoms)
  3. secondary clinical outcome during three (3) years of follow-up

Covariates & other variables

  1. Age (continuous in 1-year increment). [Age]
  2. Sex (male vs. female). [Gender]
  3. Presence of hypertension at baseline (defined either as history of hypertension, SBP ≥140 mm Hg, DBP ≥90 mm Hg, or prescription of antihypertensive medications). [Hypertension.composite]
  4. Presence of diabetes mellitus at baseline (defined either as a history of diabetes and/or administration of glucose lowering medication). [DiabetesStatus]
  5. Smoking (current, ex-, never). [SmokerStatus]
  6. LDL-C levels (continuous). [LDL_final]
  7. Use of lipid-lowering drugs. [Med.Statin.LLD]
  8. Use of antiplatelet drugs. [Med.all.antiplatelet]
  9. eGFR (continuous). [GFR_MDRD]
  10. BMI (continuous). [BMI]
  11. History of cardiovascular disease (stroke, coronary artery disease, peripheral artery disease). [MedHx_CVD] combination of [CAD_history, Stroke_history, Peripheral.interv]
  12. Level of stenosis (50-70% vs. 70-99%). [stenose]
  13. Year of surgery [ORdate_year] as we discovered in Van Lammeren et al. the composition of the plaque and therefore the Athero-Express Biobank Study has changed over the years. Likely through changes in lifestyle and primary prevention regimes.

Models

We will analyze the data through four different models

  • Model 1: adjusted for age, sex, and year of surgery
  • Model 2: adjusted for age, sex, year of surgery, and additionally adjusted for history hypertension (defined from medical history and/or use of antihypertensive medications), diabetes (defined as history of a diagnosis and/or use of glucose-lowering medications), current smoking, LDL-C levels at time of operation, use of statins, use of antiplatelet agents, eGFR, BMI, history of cardiovascular disease (coronary artery disease, stroke, peripheral artery disease), and level of stenosis (50-70%, 70-90%, 90-99%)

A. Cross-sectional analysis plaque phenotypes

In the cross-sectional analysis of plaque and plasma MCP1, IL6, and IL6R levels we will focus on the following plaque vulnerability phenotypes:

  • Percentage of macrophages (continuous trait)
  • Percentage of SMCs (continuous trait)
  • Number of intraplaque microvessels per 3-4 hotspots (continuous trait)
  • Presence of moderate/heavy calcifications (binary trait)
  • Presence of moderate/heavy collagen content (binary trait)
  • Presence of lipid core no/<10% vs. >10% (binary trait)
  • Presence of intraplaque hemorrhage (binary trait)

Continous traits


# macrophages
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$macmean0)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.0000  0.0733  0.3133  0.7688  1.0000 15.1000     679 
min_macmean <- min(AEDB.CEA$macmean0, na.rm = TRUE)
cat(paste0("\nMinimum value % macrophages: ",min_macmean,".\n"))

Minimum value % macrophages: 0.
AEDB.CEA$Macrophages_LN <- log(AEDB.CEA$macmean0 + min_macmean)

ggpubr::gghistogram(AEDB.CEA, "Macrophages_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% macrophages",
                    xlab = "natural log-transformed %", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

AEDB.CEA$Macrophages_rank <- qnorm((rank(AEDB.CEA$macmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$macmean0)))
ggpubr::gghistogram(AEDB.CEA, "Macrophages_rank", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% macrophages",
                    xlab = "inverse-rank normalized %", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

# smooth muscle cells
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$macmean0)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.0000  0.0733  0.3133  0.7688  1.0000 15.1000     679 
min_smcmean <- min(AEDB.CEA$smcmean0, na.rm = TRUE)
cat(paste0("\nMinimum value % smooth muscle cells: ",min_smcmean,".\n"))

Minimum value % smooth muscle cells: 0.
AEDB.CEA$SMC_LN <- log(AEDB.CEA$smcmean0 + min_smcmean)

ggpubr::gghistogram(AEDB.CEA, "SMC_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% smooth muscle cells",
                    xlab = "natural log-transformed %", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

AEDB.CEA$SMC_rank <- qnorm((rank(AEDB.CEA$smcmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$smcmean0)))
ggpubr::gghistogram(AEDB.CEA, "SMC_rank", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% smooth muscle cells",
                    xlab = "inverse-rank normalized %", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

# vessel density
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$vessel_density_averaged)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  0.000   4.000   7.000   8.322  11.300  48.000     813 
min_vesseldensity <- min(AEDB.CEA$vessel_density_averaged, na.rm = TRUE)
min_vesseldensity
[1] 0
cat(paste0("\nMinimum value number of intraplaque neovessels per 3-4 hotspots: ",min_vesseldensity,".\n"))

Minimum value number of intraplaque neovessels per 3-4 hotspots: 0.
AEDB.CEA$VesselDensity_LN <- log(AEDB.CEA$vessel_density_averaged + min_vesseldensity)

ggpubr::gghistogram(AEDB.CEA, "VesselDensity_LN", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels per 3-4 hotspots",
                    xlab = "natural log-transformed number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

AEDB.CEA$VesselDensity_rank <- qnorm((rank(AEDB.CEA$vessel_density_averaged, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$vessel_density_averaged)))
ggpubr::gghistogram(AEDB.CEA, "VesselDensity_rank", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels per 3-4 hotspots",
                   xlab = "inverse-rank normalized number", 
                    ggtheme = theme_minimal())
Using `bins = 30` by default. Pick better value with the argument `bins`.

Binary traits


# calcification
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$Calc.bin)
      no/minor moderate/heavy           NA's 
          1005            852            531 
contrasts(AEDB.CEA$Calc.bin)
               moderate/heavy
no/minor                    0
moderate/heavy              1
AEDB.CEA$CalcificationPlaque <- as.factor(AEDB.CEA$Calc.bin)

df <- AEDB.CEA %>%
  filter(!is.na(CalcificationPlaque)) %>%
  group_by(Gender, CalcificationPlaque) %>%
summarise(counts = n()) 

ggpubr::ggbarplot(df, x = "CalcificationPlaque", y = "counts",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#DB003F", "#1290D9"),
                    label = TRUE, lab.vjust = 2, lab.col = "#FFFFFF",
                    title = "Calcification",
                    xlab = "calcification", 
                    ggtheme = theme_minimal())

rm(df)

# collagen
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$Collagen.bin)
      no/minor moderate/heavy           NA's 
           381           1472            535 
contrasts(AEDB.CEA$Collagen.bin)
               moderate/heavy
no/minor                    0
moderate/heavy              1
AEDB.CEA$CollagenPlaque <- as.factor(AEDB.CEA$Collagen.bin)

df <- AEDB.CEA %>%
  filter(!is.na(CollagenPlaque)) %>%
  group_by(Gender, CollagenPlaque) %>%
summarise(counts = n()) 

ggpubr::ggbarplot(df, x = "CollagenPlaque", y = "counts",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#DB003F", "#1290D9"),
                    label = TRUE, lab.vjust = 2, lab.col = "#FFFFFF",
                    title = "Collagen",
                    xlab = "collagen", 
                    ggtheme = theme_minimal())

rm(df)

# fat 10%
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$Fat.bin_10)
 <10%  >10%  NA's 
  541  1321   526 
contrasts(AEDB.CEA$Fat.bin_10)
       >10%
 <10%     0
 >10%     1
AEDB.CEA$Fat10Perc <- as.factor(AEDB.CEA$Fat.bin_10)

df <- AEDB.CEA %>%
  filter(!is.na(Fat10Perc)) %>%
  group_by(Gender, Fat10Perc) %>%
summarise(counts = n()) 

ggpubr::ggbarplot(df, x = "Fat10Perc", y = "counts",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#DB003F", "#1290D9"),
                    label = TRUE, lab.vjust = 2, lab.col = "#FFFFFF",
                    title = "Intraplaque fat",
                    xlab = "intraplaque fat", 
                    ggtheme = theme_minimal())

rm(df)

# IPH
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$IPH.bin)
  no  yes NA's 
 747 1111  530 
contrasts(AEDB.CEA$IPH.bin)
    yes
no    0
yes   1
AEDB.CEA$IPH <- as.factor(AEDB.CEA$IPH.bin)

df <- AEDB.CEA %>%
  filter(!is.na(IPH)) %>%
  group_by(Gender, IPH) %>%
summarise(counts = n()) 

ggpubr::ggbarplot(df, x = "IPH", y = "counts",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#DB003F", "#1290D9"),
                    label = TRUE, lab.vjust = 2, lab.col = "#FFFFFF",
                    title = "Intraplaque hemorrhage",
                    xlab = "intraplaque hemorrhage", 
                    ggtheme = theme_minimal())

rm(df)

# Symptoms
cat("Summary of data.\n")
Summary of data.
summary(AEDB.CEA$AsymptSympt)
     Asymptomatic Ocular and others       Symptomatic              NA's 
              266               529              1582                11 
contrasts(AEDB.CEA$AsymptSympt)
                  Ocular and others Symptomatic
Asymptomatic                      0           0
Ocular and others                 1           0
Symptomatic                       0           1
AEDB.CEA$AsymptSympt <- as.factor(AEDB.CEA$AsymptSympt)

df <- AEDB.CEA %>%
  filter(!is.na(AsymptSympt)) %>%
  group_by(Gender, AsymptSympt) %>%
summarise(counts = n()) 

ggpubr::ggbarplot(df, x = "AsymptSympt", y = "counts",
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#DB003F", "#1290D9"),
                    label = TRUE, lab.vjust = 2, lab.col = "#FFFFFF",
                    title = "Symptoms",
                    xlab = "symptoms", 
                    ggtheme = theme_minimal())

rm(df)

Correlations between MCP1 plaque levels and surgery year

Here we compare the MCP1 plaque levels from experiment 1 with those experiment 2. The latter we measured in pg/mL and also corrected for the total protein content (pg/ug).

p1 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "ORyear", 
                        y = "MCP1_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "year of surgery",
                        ylab = "experiment 1",
                        title = "MCP1 plaque levels, INT, [pg/mL]",
                        ggtheme = theme_minimal())

p1 

p2 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "ORyear", 
                        y = "MCP1_pg_ml_2015_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "year of surgery",
                        ylab = "experiment 2, [pg/mL]",
                        title = "MCP1 plaque levels, INT, [pg/mL]/[pg/ug]",
                        ggtheme = theme_minimal())

p2 

p3 <- ggpubr::ggscatter(AEDB.CEA, 
                        x = "ORyear", 
                        y = "MCP1_pg_ug_2015_rank",
                        color = "#1290D9",
                        # fill = "Gender",
                        # palette = c("#1290D9", "#DB003F"),
                        add = "reg.line",
                        add.params =  list(color = "black", linetype = 2),
                        cor.coef = TRUE, cor.method = "spearman",
                        xlab = "year of surgery",
                        ylab = "experiment 2, [pg/ug]",
                        title = "MCP1 plaque levels, INT",
                        ggtheme = theme_minimal())

p3

In this section we make some variables to assist with analysis.

AEDB.CEA.samplesize = nrow(AEDB.CEA)
TRAITS.PROTEIN = c("IL6_LN", "MCP1_LN", "IL6_pg_ug_2015_LN", "IL6R_pg_ug_2015_LN", "MCP1_pg_ug_2015_LN")
TRAITS.PROTEIN.RANK = c("IL6_rank", "MCP1_rank", "IL6_pg_ug_2015_rank", "IL6R_pg_ug_2015_rank", "MCP1_pg_ug_2015_rank")

TRAITS.CON = c("Macrophages_LN", "SMC_LN", "VesselDensity_LN") 
TRAITS.CON.RANK = c("Macrophages_rank", "SMC_rank", "VesselDensity_rank")

TRAITS.BIN = c("CalcificationPlaque", "CollagenPlaque", "Fat10Perc", "IPH")

# "Hospital", 
# "Age", "Gender", 
# "TC_final", "LDL_final", "HDL_final", "TG_final", 
# "systolic", "diastoli", "GFR_MDRD", "BMI", 
# "KDOQI", "BMI_WHO",
# "SmokerCurrent", "eCigarettes", "ePackYearsSmoking",
# "DiabetesStatus", "Hypertension.composite", 
# "Hypertension.drugs", "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
# "Stroke_Dx", "sympt", "Symptoms.5G", "restenos",
# "EP_composite", "EP_composite_time",
# "macmean0", "smcmean0", "Macrophages.bin", "SMC.bin",
# "neutrophils", "Mast_cells_plaque",
# "IPH.bin", "vessel_density_averaged",
# "Calc.bin", "Collagen.bin", 
# "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype",
# "IL6_pg_ug_2015", "MCP1_pg_ug_2015", 
# "QC2018_FILTER", "CHIP", "SAMPLE_TYPE",
# "CAD_history", "Stroke_history", "Peripheral.interv",
# "stenose"

# 1.  Age (continuous in 1-year increment). [Age]
# 2.  Sex (male vs. female). [Gender]
# 3.  Presence of hypertension at baseline (defined either as history of hypertension, SBP ≥140 mm Hg, DBP ≥90 mm Hg, or prescription of antihypertensive medications). [Hypertension.composite]
# 4.  Presence of diabetes mellitus at baseline (defined either as a history of diabetes, administration of glucose lowering medication, HbA1c ≥6.5%, fasting glucose ≥126 mg/dl, .or random glucose levels ≥200 mg/dl). [DiabetesStatus]
# 5.  Smoking (current, ex-, never). [SmokerCurrent]
# 6.  LDL-C levels (continuous). [LDL_final]
# 7.  Use of lipid-lowering drugs. [Med.Statin.LLD]
# 8.  Use of antiplatelet drugs. [Med.all.antiplatelet]
# 9.  eGFR (continuous). [GFR_MDRD]
# 10.   BMI (continuous). [BMI]
# 11.   History of cardiovascular disease (stroke, coronary artery disease, peripheral artery disease). [CAD_history, Stroke_history, Peripheral.interv]
# 12.   Level of stenosis (50-70% vs. 70-99%). [stenose]
# 13.   Presenting symptoms (asymptomatic, ocular, TIA, or stroke). [Symptoms.5G]
# 14.   hsCRP circulating levels (ln-transformed, continuous). [hsCRP_plasma]
# 15.   IL-6 plaque levels (ln-transformed, continuous). [IL6_pg_ug_2015_LN]

# Models 
# Model 1: adjusted for age and sex
# Model 2: adjusted for age, sex, hypertension, diabetes, smoking, LDL-C levels, lipid-lowering drugs, antiplatelet drugs, eGFR, BMI, history of CVD, level of stenosis,
# Model 3: same to model 2, with additional adjustments for circulating CRP levels
# Model 4: same to model 2 with additional adjustment for IL6 levels in the plaque

COVARIATES_M1 = c("Age", "Gender")

COVARIATES_M2 = c(COVARIATES_M1,  
               "Hypertension.composite", "DiabetesStatus", "SmokerCurrent",
               "Med.Statin.LLD", "Med.all.antiplatelet", 
               "GFR_MDRD", "BMI", 
               "CAD_history", "Stroke_history", "Peripheral.interv",
               "stenose")

COVARIATES_M3 = c(COVARIATES_M2, "LDL_final")

COVARIATES_M4 = c(COVARIATES_M2, "hsCRP_plasma")

COVARIATES_M5 = c(COVARIATES_M2, "IL6_pg_ug_2015_LN")
COVARIATES_M5rank = c(COVARIATES_M2, "IL6_pg_ug_2015_rank")

Model 1

In this model we correct for Age, Gender, and year of surgery.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Quantitative plaque traits

Analysis of continuous/quantitative plaque traits as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
Running linear regression...
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(TRAITS.CON.RANK)) {
    TRAIT = TRAITS.CON.RANK[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender, data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))

    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of IL6_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ Gender, data = currentDF)

Coefficients:
(Intercept)   Gendermale  
     0.1147      -0.1457  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.6651 -0.7037 -0.0163  0.6872  3.0540 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.265124   0.327047   0.811    0.418
currentDF[, TRAIT] -0.043457   0.038912  -1.117    0.265
Age                -0.002260   0.004714  -0.479    0.632
Gendermale         -0.139309   0.092751  -1.502    0.134

Residual standard error: 0.9589 on 523 degrees of freedom
Multiple R-squared:  0.007532,  Adjusted R-squared:  0.001839 
F-statistic: 1.323 on 3 and 523 DF,  p-value: 0.266

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: -0.043457 
Standard error............: 0.038912 
Odds ratio (effect size)..: 0.957 
Lower 95% CI..............: 0.887 
Upper 95% CI..............: 1.033 
T-value...................: -1.116809 
P-value...................: 0.2645889 
R^2.......................: 0.007532 
Adjusted r^2..............: 0.001839 
Sample size of AE DB......: 2388 
Sample size of model......: 527 
Missing data %............: 77.93132 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ Gender, data = currentDF)

Coefficients:
(Intercept)   Gendermale  
     0.1254      -0.1467  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.66930 -0.69331 -0.00069  0.66680  2.97072 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.247782   0.339493   0.730    0.466
currentDF[, TRAIT]  0.023438   0.040868   0.573    0.567
Age                -0.001916   0.004866  -0.394    0.694
Gendermale         -0.140271   0.094251  -1.488    0.137

Residual standard error: 0.964 on 519 degrees of freedom
Multiple R-squared:  0.005833,  Adjusted R-squared:  8.659e-05 
F-statistic: 1.015 on 3 and 519 DF,  p-value: 0.3856

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: 0.023438 
Standard error............: 0.040868 
Odds ratio (effect size)..: 1.024 
Lower 95% CI..............: 0.945 
Upper 95% CI..............: 1.109 
T-value...................: 0.573496 
P-value...................: 0.5665574 
R^2.......................: 0.005833 
Adjusted r^2..............: 8.7e-05 
Sample size of AE DB......: 2388 
Sample size of model......: 523 
Missing data %............: 78.09883 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ Gender, data = currentDF)

Coefficients:
(Intercept)   Gendermale  
     0.1137      -0.1357  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.65204 -0.71205 -0.00561  0.69258  3.04629 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.335120   0.335382   0.999    0.318
currentDF[, TRAIT] -0.033064   0.052781  -0.626    0.531
Age                -0.003204   0.004831  -0.663    0.508
Gendermale         -0.135313   0.094253  -1.436    0.152

Residual standard error: 0.966 on 511 degrees of freedom
Multiple R-squared:  0.005607,  Adjusted R-squared:  -0.0002313 
F-statistic: 0.9604 on 3 and 511 DF,  p-value: 0.4112

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.033064 
Standard error............: 0.052781 
Odds ratio (effect size)..: 0.967 
Lower 95% CI..............: 0.872 
Upper 95% CI..............: 1.073 
T-value...................: -0.626443 
P-value...................: 0.5313039 
R^2.......................: 0.005607 
Adjusted r^2..............: -0.000231 
Sample size of AE DB......: 2388 
Sample size of model......: 515 
Missing data %............: 78.43384 

Analysis of MCP1_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age          Gendermale  
           0.34006             0.10727            -0.00823             0.28612  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.66459 -0.66985 -0.00544  0.65388  2.97049 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)   
(Intercept)         0.340061   0.327464   1.038  0.29950   
currentDF[, TRAIT]  0.107266   0.038479   2.788  0.00549 **
Age                -0.008230   0.004734  -1.738  0.08271 . 
Gendermale          0.286120   0.091290   3.134  0.00181 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.98 on 560 degrees of freedom
Multiple R-squared:  0.03666,   Adjusted R-squared:  0.0315 
F-statistic: 7.105 on 3 and 560 DF,  p-value: 0.0001085

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.107266 
Standard error............: 0.038479 
Odds ratio (effect size)..: 1.113 
Lower 95% CI..............: 1.032 
Upper 95% CI..............: 1.2 
T-value...................: 2.787615 
P-value...................: 0.005490063 
R^2.......................: 0.036664 
Adjusted r^2..............: 0.031504 
Sample size of AE DB......: 2388 
Sample size of model......: 564 
Missing data %............: 76.38191 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age          Gendermale  
           0.74540            -0.18145            -0.01324             0.23454  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.67204 -0.64103 -0.03139  0.64140  2.69183 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.74540    0.33159   2.248  0.02497 *  
currentDF[, TRAIT] -0.18145    0.03959  -4.583 5.65e-06 ***
Age                -0.01324    0.00477  -2.775  0.00570 ** 
Gendermale          0.23454    0.09053   2.591  0.00982 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9621 on 556 degrees of freedom
Multiple R-squared:  0.05804,   Adjusted R-squared:  0.05296 
F-statistic: 11.42 on 3 and 556 DF,  p-value: 2.82e-07

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.18145 
Standard error............: 0.039588 
Odds ratio (effect size)..: 0.834 
Lower 95% CI..............: 0.772 
Upper 95% CI..............: 0.901 
T-value...................: -4.583453 
P-value...................: 5.652515e-06 
R^2.......................: 0.058039 
Adjusted r^2..............: 0.052957 
Sample size of AE DB......: 2388 
Sample size of model......: 560 
Missing data %............: 76.54941 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age          Gendermale  
           0.39679            -0.09755            -0.00880             0.31637  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.69246 -0.65643  0.00031  0.65368  2.74036 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.39679    0.33186   1.196  0.23235    
currentDF[, TRAIT] -0.09755    0.05111  -1.909  0.05680 .  
Age                -0.00880    0.00479  -1.837  0.06674 .  
Gendermale          0.31637    0.09248   3.421  0.00067 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9842 on 549 degrees of freedom
Multiple R-squared:  0.03246,   Adjusted R-squared:  0.02717 
F-statistic: 6.139 on 3 and 549 DF,  p-value: 0.0004131

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.097554 
Standard error............: 0.051106 
Odds ratio (effect size)..: 0.907 
Lower 95% CI..............: 0.821 
Upper 95% CI..............: 1.003 
T-value...................: -1.908837 
P-value...................: 0.05680423 
R^2.......................: 0.032459 
Adjusted r^2..............: 0.027172 
Sample size of AE DB......: 2388 
Sample size of model......: 553 
Missing data %............: 76.84255 

Analysis of IL6_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
         0.0008327           0.1298916  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.2750 -0.6882  0.0017  0.6410  3.6437 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.080646   0.226702   0.356    0.722    
currentDF[, TRAIT]  0.128610   0.029926   4.298 1.88e-05 ***
Age                -0.001259   0.003217  -0.391    0.696    
Gendermale          0.009559   0.064377   0.148    0.882    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9916 on 1124 degrees of freedom
Multiple R-squared:  0.01684,   Adjusted R-squared:  0.01421 
F-statistic: 6.417 on 3 and 1124 DF,  p-value: 0.0002611

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.12861 
Standard error............: 0.029926 
Odds ratio (effect size)..: 1.137 
Lower 95% CI..............: 1.072 
Upper 95% CI..............: 1.206 
T-value...................: 4.297634 
P-value...................: 1.875797e-05 
R^2.......................: 0.016839 
Adjusted r^2..............: 0.014215 
Sample size of AE DB......: 2388 
Sample size of model......: 1128 
Missing data %............: 52.76382 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age  
          0.379605           -0.140378           -0.005529  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.0677 -0.6892 -0.0049  0.6794  3.1705 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.386998   0.231838   1.669   0.0953 .  
currentDF[, TRAIT] -0.141045   0.031339  -4.501 7.48e-06 ***
Age                -0.005538   0.003272  -1.692   0.0909 .  
Gendermale         -0.009751   0.064944  -0.150   0.8807    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9908 on 1120 degrees of freedom
Multiple R-squared:  0.01862,   Adjusted R-squared:  0.01599 
F-statistic: 7.084 on 3 and 1120 DF,  p-value: 0.0001021

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.141045 
Standard error............: 0.031339 
Odds ratio (effect size)..: 0.868 
Lower 95% CI..............: 0.817 
Upper 95% CI..............: 0.923 
T-value...................: -4.5006 
P-value...................: 7.483581e-06 
R^2.......................: 0.018623 
Adjusted r^2..............: 0.015994 
Sample size of AE DB......: 2388 
Sample size of model......: 1124 
Missing data %............: 52.93132 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
         -0.005939           -0.045061  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.2631 -0.6756  0.0016  0.6855  3.3859 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.113002   0.237668   0.475    0.635
currentDF[, TRAIT] -0.045329   0.031251  -1.450    0.147
Age                -0.001943   0.003369  -0.577    0.564
Gendermale          0.020800   0.067259   0.309    0.757

Residual standard error: 1.002 on 1048 degrees of freedom
Multiple R-squared:  0.002385,  Adjusted R-squared:  -0.0004703 
F-statistic: 0.8353 on 3 and 1048 DF,  p-value: 0.4745

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.045329 
Standard error............: 0.031251 
Odds ratio (effect size)..: 0.956 
Lower 95% CI..............: 0.899 
Upper 95% CI..............: 1.016 
T-value...................: -1.450483 
P-value...................: 0.147223 
R^2.......................: 0.002385 
Adjusted r^2..............: -0.00047 
Sample size of AE DB......: 2388 
Sample size of model......: 1052 
Missing data %............: 55.9464 

Analysis of IL6R_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
          0.006105            0.171717  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1452 -0.6436 -0.0070  0.6466  3.3803 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.323725   0.226682   1.428    0.154    
currentDF[, TRAIT]  0.171595   0.029416   5.833 7.09e-09 ***
Age                -0.003819   0.003210  -1.190    0.234    
Gendermale         -0.078695   0.064098  -1.228    0.220    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9838 on 1124 degrees of freedom
Multiple R-squared:  0.03229,   Adjusted R-squared:  0.02971 
F-statistic:  12.5 on 3 and 1124 DF,  p-value: 4.811e-08

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.171595 
Standard error............: 0.029416 
Odds ratio (effect size)..: 1.187 
Lower 95% CI..............: 1.121 
Upper 95% CI..............: 1.258 
T-value...................: 5.833439 
P-value...................: 7.092794e-09 
R^2.......................: 0.03229 
Adjusted r^2..............: 0.029707 
Sample size of AE DB......: 2388 
Sample size of model......: 1128 
Missing data %............: 52.76382 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
          0.003564            0.085455  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.2788 -0.6560  0.0049  0.6817  3.3960 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)         0.279731   0.234166   1.195   0.2325  
currentDF[, TRAIT]  0.077483   0.031462   2.463   0.0139 *
Age                -0.003775   0.003299  -1.145   0.2526  
Gendermale         -0.023816   0.065312  -0.365   0.7154  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9939 on 1120 degrees of freedom
Multiple R-squared:  0.008145,  Adjusted R-squared:  0.005488 
F-statistic: 3.066 on 3 and 1120 DF,  p-value: 0.0272

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: 0.077483 
Standard error............: 0.031462 
Odds ratio (effect size)..: 1.081 
Lower 95% CI..............: 1.016 
Upper 95% CI..............: 1.149 
T-value...................: 2.462754 
P-value...................: 0.0139371 
R^2.......................: 0.008145 
Adjusted r^2..............: 0.005488 
Sample size of AE DB......: 2388 
Sample size of model......: 1124 
Missing data %............: 52.93132 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age  
          0.363777            0.108548           -0.005145  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3980 -0.6565 -0.0131  0.6619  3.3784 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.40529    0.23903   1.696  0.09027 .  
currentDF[, TRAIT]  0.10889    0.03133   3.476  0.00053 ***
Age                -0.00514    0.00338  -1.521  0.12864    
Gendermale         -0.05983    0.06724  -0.890  0.37373    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9985 on 1047 degrees of freedom
Multiple R-squared:  0.01437,   Adjusted R-squared:  0.01154 
F-statistic: 5.087 on 3 and 1047 DF,  p-value: 0.001687

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: 0.108891 
Standard error............: 0.03133 
Odds ratio (effect size)..: 1.115 
Lower 95% CI..............: 1.049 
Upper 95% CI..............: 1.186 
T-value...................: 3.475655 
P-value...................: 0.0005304978 
R^2.......................: 0.014366 
Adjusted r^2..............: 0.011542 
Sample size of AE DB......: 2388 
Sample size of model......: 1051 
Missing data %............: 55.98828 

Analysis of MCP1_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Gender, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]          Gendermale  
          -0.08851            -0.04407             0.10833  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.4091 -0.6867  0.0027  0.6638  3.3363 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)  
(Intercept)        -0.0521469  0.2245097  -0.232   0.8164  
currentDF[, TRAIT] -0.0445154  0.0293223  -1.518   0.1292  
Age                -0.0005313  0.0031888  -0.167   0.8677  
Gendermale          0.1084819  0.0633932   1.711   0.0873 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9994 on 1168 degrees of freedom
Multiple R-squared:  0.004169,  Adjusted R-squared:  0.001611 
F-statistic:  1.63 on 3 and 1168 DF,  p-value: 0.1807

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: -0.044515 
Standard error............: 0.029322 
Odds ratio (effect size)..: 0.956 
Lower 95% CI..............: 0.903 
Upper 95% CI..............: 1.013 
T-value...................: -1.518139 
P-value...................: 0.1292499 
R^2.......................: 0.004169 
Adjusted r^2..............: 0.001611 
Sample size of AE DB......: 2388 
Sample size of model......: 1172 
Missing data %............: 50.92127 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT], data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]  
          -0.01583            -0.11198  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.4371 -0.6552 -0.0098  0.6354  3.3670 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.103027   0.228379   0.451 0.651986    
currentDF[, TRAIT] -0.111746   0.030611  -3.651 0.000273 ***
Age                -0.002390   0.003226  -0.741 0.458971    
Gendermale          0.065262   0.063722   1.024 0.305970    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9951 on 1164 degrees of freedom
Multiple R-squared:  0.01332,   Adjusted R-squared:  0.01078 
F-statistic: 5.238 on 3 and 1164 DF,  p-value: 0.001359

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.111746 
Standard error............: 0.030611 
Odds ratio (effect size)..: 0.894 
Lower 95% CI..............: 0.842 
Upper 95% CI..............: 0.95 
T-value...................: -3.650566 
P-value...................: 0.0002732734 
R^2.......................: 0.013321 
Adjusted r^2..............: 0.010778 
Sample size of AE DB......: 2388 
Sample size of model......: 1168 
Missing data %............: 51.08878 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Gender, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]          Gendermale  
           -0.1167             -0.1300              0.1283  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender, data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.2795 -0.6726  0.0001  0.6322  3.4098 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -0.1460528  0.2332909  -0.626   0.5314    
currentDF[, TRAIT] -0.1299743  0.0305087  -4.260 2.22e-05 ***
Age                 0.0004283  0.0033099   0.129   0.8971    
Gendermale          0.1282621  0.0656979   1.952   0.0512 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.002 on 1090 degrees of freedom
Multiple R-squared:  0.01952,   Adjusted R-squared:  0.01682 
F-statistic: 7.234 on 3 and 1090 DF,  p-value: 8.293e-05

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.129974 
Standard error............: 0.030509 
Odds ratio (effect size)..: 0.878 
Lower 95% CI..............: 0.827 
Upper 95% CI..............: 0.932 
T-value...................: -4.260235 
P-value...................: 2.218457e-05 
R^2.......................: 0.019522 
Adjusted r^2..............: 0.016823 
Sample size of AE DB......: 2388 
Sample size of model......: 1094 
Missing data %............: 54.1876 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Con.Uni.Protein.PlaquePhenotypes.RANK.MODEL1.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Con.Uni.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Binary plaque traits

Analysis of binary plaque traits as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(TRAITS.BIN)) {
    TRAIT = TRAITS.BIN[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate
    fit <- glm(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender,
              data  =  currentDF, family = binomial(link = "logit"))
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 16, nrow = 0))
    GLM.results.TEMP[1,] = GLM.BIN(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of IL6_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN], 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]  
              0.3364                0.1700  

Degrees of Freedom: 527 Total (i.e. Null);  526 Residual
Null Deviance:      717.2 
Residual Deviance: 713.8    AIC: 717.8

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6055  -1.2824   0.9442   1.0453   1.2408  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)  
(Intercept)          -0.39815    0.69417  -0.574   0.5663  
currentDF[, PROTEIN]  0.16861    0.09329   1.807   0.0707 .
Age                   0.01255    0.01003   1.251   0.2108  
Gendermale           -0.15185    0.19853  -0.765   0.4443  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 717.23  on 527  degrees of freedom
Residual deviance: 711.68  on 524  degrees of freedom
AIC: 719.68

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: 0.168614 
Standard error............: 0.093291 
Odds ratio (effect size)..: 1.184 
Lower 95% CI..............: 0.986 
Upper 95% CI..............: 1.421 
Z-value...................: 1.807395 
P-value...................: 0.07070067 
Hosmer and Lemeshow r^2...: 0.007736 
Cox and Snell r^2.........: 0.010453 
Nagelkerke's pseudo r^2...: 0.01407 
Sample size of AE DB......: 2388 
Sample size of model......: 528 
Missing data %............: 77.88945 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ 1, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)  
      1.439  

Degrees of Freedom: 526 Total (i.e. Null);  526 Residual
Null Deviance:      515 
Residual Deviance: 515  AIC: 517

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0039   0.5622   0.6281   0.6781   0.8143  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)   
(Intercept)           2.50639    0.90034   2.784  0.00537 **
currentDF[, PROTEIN] -0.15233    0.11589  -1.314  0.18871   
Age                  -0.01370    0.01281  -1.069  0.28490   
Gendermale           -0.18207    0.25283  -0.720  0.47146   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 514.99  on 526  degrees of freedom
Residual deviance: 511.76  on 523  degrees of freedom
AIC: 519.76

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.152332 
Standard error............: 0.115895 
Odds ratio (effect size)..: 0.859 
Lower 95% CI..............: 0.684 
Upper 95% CI..............: 1.078 
Z-value...................: -1.314401 
P-value...................: 0.1887114 
Hosmer and Lemeshow r^2...: 0.006272 
Cox and Snell r^2.........: 0.00611 
Nagelkerke's pseudo r^2...: 0.009798 
Sample size of AE DB......: 2388 
Sample size of model......: 527 
Missing data %............: 77.93132 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)   Gendermale  
     0.8473       0.8007  

Degrees of Freedom: 527 Total (i.e. Null);  526 Residual
Null Deviance:      529.5 
Residual Deviance: 517.4    AIC: 521.4

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0323   0.5426   0.5923   0.6460   0.9468  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)          0.633935   0.848167   0.747 0.454812    
currentDF[, PROTEIN] 0.142074   0.114411   1.242 0.214314    
Age                  0.002994   0.012321   0.243 0.807985    
Gendermale           0.822167   0.227638   3.612 0.000304 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 529.53  on 527  degrees of freedom
Residual deviance: 515.77  on 524  degrees of freedom
AIC: 523.77

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.142074 
Standard error............: 0.114411 
Odds ratio (effect size)..: 1.153 
Lower 95% CI..............: 0.921 
Upper 95% CI..............: 1.442 
Z-value...................: 1.24179 
P-value...................: 0.214314 
Hosmer and Lemeshow r^2...: 0.025995 
Cox and Snell r^2.........: 0.025733 
Nagelkerke's pseudo r^2...: 0.040641 
Sample size of AE DB......: 2388 
Sample size of model......: 528 
Missing data %............: 77.88945 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age   Gendermale  
   -1.53026      0.03187      0.77077  

Degrees of Freedom: 527 Total (i.e. Null);  525 Residual
Null Deviance:      589.4 
Residual Deviance: 569.3    AIC: 575.3

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0272   0.5126   0.6441   0.7617   1.3318  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -1.531376   0.788651  -1.942 0.052165 .  
currentDF[, PROTEIN]  0.004591   0.106067   0.043 0.965479    
Age                   0.031879   0.011544   2.761 0.005754 ** 
Gendermale            0.771453   0.215860   3.574 0.000352 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 589.39  on 527  degrees of freedom
Residual deviance: 569.29  on 524  degrees of freedom
AIC: 577.29

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.004591 
Standard error............: 0.106067 
Odds ratio (effect size)..: 1.005 
Lower 95% CI..............: 0.816 
Upper 95% CI..............: 1.237 
Z-value...................: 0.043279 
P-value...................: 0.9654788 
Hosmer and Lemeshow r^2...: 0.034097 
Cox and Snell r^2.........: 0.037347 
Nagelkerke's pseudo r^2...: 0.055534 
Sample size of AE DB......: 2388 
Sample size of model......: 528 
Missing data %............: 77.88945 

Analysis of MCP1_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age  
   -0.66894      0.01552  

Degrees of Freedom: 564 Total (i.e. Null);  563 Residual
Null Deviance:      763.6 
Residual Deviance: 761.1    AIC: 765.1

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5354  -1.3063   0.9435   1.0328   1.2735  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)
(Intercept)          -0.520510   0.681656  -0.764    0.445
currentDF[, PROTEIN] -0.084572   0.087486  -0.967    0.334
Age                   0.015036   0.009908   1.518    0.129
Gendermale           -0.159870   0.193286  -0.827    0.408

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 763.63  on 564  degrees of freedom
Residual deviance: 759.27  on 561  degrees of freedom
AIC: 767.27

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.084572 
Standard error............: 0.087486 
Odds ratio (effect size)..: 0.919 
Lower 95% CI..............: 0.774 
Upper 95% CI..............: 1.091 
Z-value...................: -0.966696 
P-value...................: 0.3336962 
Hosmer and Lemeshow r^2...: 0.005706 
Cox and Snell r^2.........: 0.007683 
Nagelkerke's pseudo r^2...: 0.010366 
Sample size of AE DB......: 2388 
Sample size of model......: 565 
Missing data %............: 76.34003 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN], 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]  
              1.5378               -0.5379  

Degrees of Freedom: 562 Total (i.e. Null);  561 Residual
Null Deviance:      547.6 
Residual Deviance: 524.3    AIC: 528.3

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4625   0.4102   0.5643   0.6848   1.1638  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)           2.84690    0.91211   3.121   0.0018 ** 
currentDF[, PROTEIN] -0.54841    0.11723  -4.678  2.9e-06 ***
Age                  -0.01803    0.01302  -1.384   0.1663    
Gendermale           -0.11699    0.25442  -0.460   0.6456    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 547.57  on 562  degrees of freedom
Residual deviance: 522.07  on 559  degrees of freedom
AIC: 530.07

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.548413 
Standard error............: 0.117233 
Odds ratio (effect size)..: 0.578 
Lower 95% CI..............: 0.459 
Upper 95% CI..............: 0.727 
Z-value...................: -4.677968 
P-value...................: 2.897316e-06 
Hosmer and Lemeshow r^2...: 0.046582 
Cox and Snell r^2.........: 0.044294 
Nagelkerke's pseudo r^2...: 0.071224 
Sample size of AE DB......: 2388 
Sample size of model......: 563 
Missing data %............: 76.42379 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale  
              1.1894                0.6807                0.5650  

Degrees of Freedom: 564 Total (i.e. Null);  562 Residual
Null Deviance:      554.2 
Residual Deviance: 509.3    AIC: 515.3

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4929   0.3605   0.5225   0.6691   1.3725  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)           0.85428    0.86465   0.988   0.3231    
currentDF[, PROTEIN]  0.68303    0.12124   5.634 1.76e-08 ***
Age                   0.00499    0.01257   0.397   0.6914    
Gendermale            0.56378    0.23128   2.438   0.0148 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 554.19  on 564  degrees of freedom
Residual deviance: 509.11  on 561  degrees of freedom
AIC: 517.11

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.68303 
Standard error............: 0.12124 
Odds ratio (effect size)..: 1.98 
Lower 95% CI..............: 1.561 
Upper 95% CI..............: 2.511 
Z-value...................: 5.633721 
P-value...................: 1.763624e-08 
Hosmer and Lemeshow r^2...: 0.081344 
Cox and Snell r^2.........: 0.076687 
Nagelkerke's pseudo r^2...: 0.122697 
Sample size of AE DB......: 2388 
Sample size of model......: 565 
Missing data %............: 76.34003 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age   Gendermale  
   -1.02619      0.02446      0.78389  

Degrees of Freedom: 564 Total (i.e. Null);  562 Residual
Null Deviance:      625.9 
Residual Deviance: 607.1    AIC: 613.1

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0414   0.5339   0.6471   0.7406   1.2555  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -1.06199    0.77564  -1.369 0.170946    
currentDF[, PROTEIN]  0.10109    0.10144   0.997 0.318965    
Age                   0.02532    0.01139   2.224 0.026177 *  
Gendermale            0.75630    0.20942   3.611 0.000304 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 625.93  on 564  degrees of freedom
Residual deviance: 606.14  on 561  degrees of freedom
AIC: 614.14

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.101091 
Standard error............: 0.101437 
Odds ratio (effect size)..: 1.106 
Lower 95% CI..............: 0.907 
Upper 95% CI..............: 1.35 
Z-value...................: 0.996588 
P-value...................: 0.3189645 
Hosmer and Lemeshow r^2...: 0.031618 
Cox and Snell r^2.........: 0.034421 
Nagelkerke's pseudo r^2...: 0.051395 
Sample size of AE DB......: 2388 
Sample size of model......: 565 
Missing data %............: 76.34003 

Analysis of IL6_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
            -0.82326              -0.11365               0.01351              -0.20124  

Degrees of Freedom: 1133 Total (i.e. Null);  1130 Residual
Null Deviance:      1572 
Residual Deviance: 1561     AIC: 1569

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.405  -1.151  -1.013   1.182   1.494  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)  
(Intercept)          -0.823262   0.458227  -1.797   0.0724 .
currentDF[, PROTEIN] -0.113647   0.059989  -1.894   0.0582 .
Age                   0.013512   0.006506   2.077   0.0378 *
Gendermale           -0.201235   0.129656  -1.552   0.1206  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1571.7  on 1133  degrees of freedom
Residual deviance: 1561.2  on 1130  degrees of freedom
AIC: 1569.2

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.113647 
Standard error............: 0.059989 
Odds ratio (effect size)..: 0.893 
Lower 95% CI..............: 0.794 
Upper 95% CI..............: 1.004 
Z-value...................: -1.89445 
P-value...................: 0.05816533 
Hosmer and Lemeshow r^2...: 0.006689 
Cox and Snell r^2.........: 0.009228 
Nagelkerke's pseudo r^2...: 0.012306 
Sample size of AE DB......: 2388 
Sample size of model......: 1134 
Missing data %............: 52.51256 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN], 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]  
              1.3407               -0.2859  

Degrees of Freedom: 1135 Total (i.e. Null);  1134 Residual
Null Deviance:      1172 
Residual Deviance: 1156     AIC: 1160

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0925   0.5434   0.6477   0.7187   0.9893  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)           1.209758   0.559055   2.164 0.030469 *  
currentDF[, PROTEIN] -0.284656   0.074277  -3.832 0.000127 ***
Age                   0.002611   0.007932   0.329 0.742003    
Gendermale           -0.068954   0.160475  -0.430 0.667424    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1171.5  on 1135  degrees of freedom
Residual deviance: 1156.1  on 1132  degrees of freedom
AIC: 1164.1

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.284656 
Standard error............: 0.074277 
Odds ratio (effect size)..: 0.752 
Lower 95% CI..............: 0.65 
Upper 95% CI..............: 0.87 
Z-value...................: -3.832368 
P-value...................: 0.0001269155 
Hosmer and Lemeshow r^2...: 0.013161 
Cox and Snell r^2.........: 0.013481 
Nagelkerke's pseudo r^2...: 0.020951 
Sample size of AE DB......: 2388 
Sample size of model......: 1136 
Missing data %............: 52.42881 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
            -0.45642               0.49681               0.01386               0.86551  

Degrees of Freedom: 1135 Total (i.e. Null);  1132 Residual
Null Deviance:      1320 
Residual Deviance: 1232     AIC: 1240

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2318  -1.0860   0.6253   0.8001   1.4676  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.456424   0.525551  -0.868   0.3851    
currentDF[, PROTEIN]  0.496810   0.072834   6.821 9.03e-12 ***
Age                   0.013863   0.007517   1.844   0.0651 .  
Gendermale            0.865510   0.144282   5.999 1.99e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1319.7  on 1135  degrees of freedom
Residual deviance: 1231.7  on 1132  degrees of freedom
AIC: 1239.7

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.49681 
Standard error............: 0.072834 
Odds ratio (effect size)..: 1.643 
Lower 95% CI..............: 1.425 
Upper 95% CI..............: 1.896 
Z-value...................: 6.821123 
P-value...................: 9.033127e-12 
Hosmer and Lemeshow r^2...: 0.066674 
Cox and Snell r^2.........: 0.074533 
Nagelkerke's pseudo r^2...: 0.108482 
Sample size of AE DB......: 2388 
Sample size of model......: 1136 
Missing data %............: 52.42881 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)   Gendermale  
    0.02326      0.64534  

Degrees of Freedom: 1134 Total (i.e. Null);  1133 Residual
Null Deviance:      1514 
Residual Deviance: 1490     AIC: 1494

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5453  -1.2340   0.8904   0.9307   1.2566  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.302686   0.470800  -0.643    0.520    
currentDF[, PROTEIN]  0.065082   0.061907   1.051    0.293    
Age                   0.004786   0.006696   0.715    0.475    
Gendermale            0.642790   0.131532   4.887 1.02e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1513.8  on 1134  degrees of freedom
Residual deviance: 1488.1  on 1131  degrees of freedom
AIC: 1496.1

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.065082 
Standard error............: 0.061907 
Odds ratio (effect size)..: 1.067 
Lower 95% CI..............: 0.945 
Upper 95% CI..............: 1.205 
Z-value...................: 1.051285 
P-value...................: 0.2931276 
Hosmer and Lemeshow r^2...: 0.016972 
Cox and Snell r^2.........: 0.022382 
Nagelkerke's pseudo r^2...: 0.030389 
Sample size of AE DB......: 2388 
Sample size of model......: 1135 
Missing data %............: 52.47069 

Analysis of IL6R_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age   Gendermale  
   -0.70308      0.01195     -0.21761  

Degrees of Freedom: 1134 Total (i.e. Null);  1132 Residual
Null Deviance:      1573 
Residual Deviance: 1567     AIC: 1573

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.351  -1.156  -1.036   1.190   1.372  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)  
(Intercept)          -0.722969   0.461171  -1.568   0.1170  
currentDF[, PROTEIN]  0.050413   0.059798   0.843   0.3992  
Age                   0.012220   0.006533   1.871   0.0614 .
Gendermale           -0.215830   0.129855  -1.662   0.0965 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1573.1  on 1134  degrees of freedom
Residual deviance: 1566.3  on 1131  degrees of freedom
AIC: 1574.3

Number of Fisher Scoring iterations: 3

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: 0.050413 
Standard error............: 0.059798 
Odds ratio (effect size)..: 1.052 
Lower 95% CI..............: 0.935 
Upper 95% CI..............: 1.182 
Z-value...................: 0.843058 
P-value...................: 0.3991959 
Hosmer and Lemeshow r^2...: 0.004357 
Cox and Snell r^2.........: 0.006021 
Nagelkerke's pseudo r^2...: 0.008028 
Sample size of AE DB......: 2388 
Sample size of model......: 1135 
Missing data %............: 52.47069 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ 1, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)  
      1.303  

Degrees of Freedom: 1136 Total (i.e. Null);  1136 Residual
Null Deviance:      1180 
Residual Deviance: 1180     AIC: 1182

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8412   0.6608   0.6871   0.7021   0.7501  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)  
(Intercept)          1.055209   0.556645   1.896    0.058 .
currentDF[, PROTEIN] 0.054395   0.072780   0.747    0.455  
Age                  0.003366   0.007898   0.426    0.670  
Gendermale           0.024221   0.157433   0.154    0.878  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1179.9  on 1136  degrees of freedom
Residual deviance: 1179.1  on 1133  degrees of freedom
AIC: 1187.1

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: 0.054395 
Standard error............: 0.07278 
Odds ratio (effect size)..: 1.056 
Lower 95% CI..............: 0.916 
Upper 95% CI..............: 1.218 
Z-value...................: 0.74739 
P-value...................: 0.4548283 
Hosmer and Lemeshow r^2...: 0.000619 
Cox and Snell r^2.........: 0.000642 
Nagelkerke's pseudo r^2...: 0.000995 
Sample size of AE DB......: 2388 
Sample size of model......: 1137 
Missing data %............: 52.38694 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
            -0.44254               0.13586               0.01312               0.82461  

Degrees of Freedom: 1136 Total (i.e. Null);  1133 Residual
Null Deviance:      1324 
Residual Deviance: 1284     AIC: 1292

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9008  -1.2841   0.6888   0.7635   1.2184  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.442537   0.517161  -0.856   0.3922    
currentDF[, PROTEIN]  0.135860   0.068675   1.978   0.0479 *  
Age                   0.013117   0.007375   1.779   0.0753 .  
Gendermale            0.824605   0.141034   5.847 5.01e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1324.4  on 1136  degrees of freedom
Residual deviance: 1284.5  on 1133  degrees of freedom
AIC: 1292.5

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.13586 
Standard error............: 0.068675 
Odds ratio (effect size)..: 1.146 
Lower 95% CI..............: 1.001 
Upper 95% CI..............: 1.311 
Z-value...................: 1.97829 
P-value...................: 0.04789604 
Hosmer and Lemeshow r^2...: 0.030128 
Cox and Snell r^2.........: 0.034484 
Nagelkerke's pseudo r^2...: 0.050122 
Sample size of AE DB......: 2388 
Sample size of model......: 1137 
Missing data %............: 52.38694 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale  
             0.04247               0.15197               0.60545  

Degrees of Freedom: 1134 Total (i.e. Null);  1132 Residual
Null Deviance:      1516 
Residual Deviance: 1489     AIC: 1495

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6477  -1.2918   0.8750   0.9619   1.3214  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.145527   0.475505  -0.306   0.7596    
currentDF[, PROTEIN]  0.153359   0.062198   2.466   0.0137 *  
Age                   0.002740   0.006747   0.406   0.6847    
Gendermale            0.605104   0.132160   4.579 4.68e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1515.7  on 1134  degrees of freedom
Residual deviance: 1489.0  on 1131  degrees of freedom
AIC: 1497

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.153359 
Standard error............: 0.062198 
Odds ratio (effect size)..: 1.166 
Lower 95% CI..............: 1.032 
Upper 95% CI..............: 1.317 
Z-value...................: 2.46566 
P-value...................: 0.0136761 
Hosmer and Lemeshow r^2...: 0.017572 
Cox and Snell r^2.........: 0.023192 
Nagelkerke's pseudo r^2...: 0.031471 
Sample size of AE DB......: 2388 
Sample size of model......: 1135 
Missing data %............: 52.47069 

Analysis of MCP1_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
            -0.87403              -0.45247               0.01396              -0.19322  

Degrees of Freedom: 1178 Total (i.e. Null);  1175 Residual
Null Deviance:      1634 
Residual Deviance: 1571     AIC: 1579

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.7850  -1.1164  -0.7578   1.1280   1.9083  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.874028   0.460395  -1.898   0.0576 .  
currentDF[, PROTEIN] -0.452467   0.062870  -7.197 6.16e-13 ***
Age                   0.013956   0.006536   2.135   0.0327 *  
Gendermale           -0.193224   0.129705  -1.490   0.1363    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1633.9  on 1178  degrees of freedom
Residual deviance: 1571.0  on 1175  degrees of freedom
AIC: 1579

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.452467 
Standard error............: 0.06287 
Odds ratio (effect size)..: 0.636 
Lower 95% CI..............: 0.562 
Upper 95% CI..............: 0.719 
Z-value...................: -7.196888 
P-value...................: 6.160221e-13 
Hosmer and Lemeshow r^2...: 0.03853 
Cox and Snell r^2.........: 0.051997 
Nagelkerke's pseudo r^2...: 0.069339 
Sample size of AE DB......: 2388 
Sample size of model......: 1179 
Missing data %............: 50.62814 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN], 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]  
              1.3322               -0.2276  

Degrees of Freedom: 1180 Total (i.e. Null);  1179 Residual
Null Deviance:      1217 
Residual Deviance: 1207     AIC: 1211

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0999   0.5754   0.6578   0.7138   0.9467  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)   
(Intercept)           1.210693   0.546856   2.214  0.02683 * 
currentDF[, PROTEIN] -0.227373   0.072305  -3.145  0.00166 **
Age                   0.001751   0.007781   0.225  0.82191   
Gendermale            0.001944   0.155632   0.012  0.99004   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1216.6  on 1180  degrees of freedom
Residual deviance: 1206.5  on 1177  degrees of freedom
AIC: 1214.5

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.227373 
Standard error............: 0.072305 
Odds ratio (effect size)..: 0.797 
Lower 95% CI..............: 0.691 
Upper 95% CI..............: 0.918 
Z-value...................: -3.144645 
P-value...................: 0.001662884 
Hosmer and Lemeshow r^2...: 0.008293 
Cox and Snell r^2.........: 0.008507 
Nagelkerke's pseudo r^2...: 0.013229 
Sample size of AE DB......: 2388 
Sample size of model......: 1181 
Missing data %............: 50.54439 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
            -0.33492               0.16339               0.01125               0.84917  

Degrees of Freedom: 1180 Total (i.e. Null);  1177 Residual
Null Deviance:      1384 
Residual Deviance: 1336     AIC: 1344

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9529  -1.2790   0.6795   0.7714   1.2276  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.334921   0.503185  -0.666   0.5057    
currentDF[, PROTEIN]  0.163390   0.066951   2.440   0.0147 *  
Age                   0.011250   0.007195   1.564   0.1179    
Gendermale            0.849174   0.137286   6.185 6.19e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1383.8  on 1180  degrees of freedom
Residual deviance: 1336.3  on 1177  degrees of freedom
AIC: 1344.3

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.16339 
Standard error............: 0.066951 
Odds ratio (effect size)..: 1.177 
Lower 95% CI..............: 1.033 
Upper 95% CI..............: 1.343 
Z-value...................: 2.440433 
P-value...................: 0.01466968 
Hosmer and Lemeshow r^2...: 0.034383 
Cox and Snell r^2.........: 0.039487 
Nagelkerke's pseudo r^2...: 0.057213 
Sample size of AE DB......: 2388 
Sample size of model......: 1181 
Missing data %............: 50.54439 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale  
             0.02354              -0.12418               0.62708  

Degrees of Freedom: 1178 Total (i.e. Null);  1176 Residual
Null Deviance:      1576 
Residual Deviance: 1549     AIC: 1555

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6449  -1.2648   0.8841   0.9534   1.3387  

Coefficients:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)          -0.166656   0.462054  -0.361   0.7183    
currentDF[, PROTEIN] -0.123887   0.060696  -2.041   0.0412 *  
Age                   0.002781   0.006577   0.423   0.6725    
Gendermale            0.626312   0.128886   4.859 1.18e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1576.2  on 1178  degrees of freedom
Residual deviance: 1549.0  on 1175  degrees of freedom
AIC: 1557

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: -0.123887 
Standard error............: 0.060696 
Odds ratio (effect size)..: 0.883 
Lower 95% CI..............: 0.784 
Upper 95% CI..............: 0.995 
Z-value...................: -2.041093 
P-value...................: 0.04124156 
Hosmer and Lemeshow r^2...: 0.017232 
Cox and Snell r^2.........: 0.022773 
Nagelkerke's pseudo r^2...: 0.030886 
Sample size of AE DB......: 2388 
Sample size of model......: 1179 
Missing data %............: 50.62814 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "Z-value", "P-value", "r^2_l", "r^2_cs", "r^2_nagelkerke", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`Z-value` <- as.numeric(GLM.results$`Z-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2_l` <- as.numeric(GLM.results$`r^2_l`)
GLM.results$`r^2_cs` <- as.numeric(GLM.results$`r^2_cs`)
GLM.results$`r^2_nagelkerke` <- as.numeric(GLM.results$`r^2_nagelkerke`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Bin.Uni.Protein.PlaquePhenotypes.RANK.MODEL1.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Bin.Uni.PlaquePheno")

# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Model 2

In this model we correct for Age, Gender, year of surgery, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Quantitative plaque traits

Analysis of continuous/quantitative plaque traits as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
Running linear regression...
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(TRAITS.CON.RANK)) {
    TRAIT = TRAITS.CON.RANK[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + 
                Hypertension.composite + DiabetesStatus + SmokerCurrent + 
                Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
                CAD_history + Stroke_history + Peripheral.interv + stenose, 
              data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of IL6_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Med.Statin.LLD + 
    CAD_history, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]   Med.Statin.LLDyes         CAD_history  
           0.06578            -0.06829            -0.15943             0.17897  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.18012 -0.68054  0.01814  0.64545  3.12461 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                2.0235458  0.8716104   2.322   0.0207 *
currentDF[, TRAIT]        -0.0685416  0.0417359  -1.642   0.1012  
Age                       -0.0066245  0.0057643  -1.149   0.2510  
Gendermale                -0.1469518  0.1015109  -1.448   0.1484  
Hypertension.compositeyes  0.0462797  0.1352200   0.342   0.7323  
DiabetesStatusDiabetes    -0.0287032  0.1144777  -0.251   0.8021  
SmokerCurrentyes           0.0296470  0.0980327   0.302   0.7625  
Med.Statin.LLDyes         -0.1940609  0.1023977  -1.895   0.0587 .
Med.all.antiplateletyes   -0.2470769  0.1608439  -1.536   0.1252  
GFR_MDRD                   0.0005454  0.0025737   0.212   0.8323  
BMI                       -0.0165307  0.0123925  -1.334   0.1829  
CAD_history                0.2248719  0.1011374   2.223   0.0267 *
Stroke_history             0.0695885  0.0961747   0.724   0.4697  
Peripheral.interv         -0.0107614  0.1147908  -0.094   0.9254  
stenose50-70%             -0.8489816  0.6177818  -1.374   0.1700  
stenose70-90%             -0.8371936  0.5706953  -1.467   0.1431  
stenose90-99%             -0.8337094  0.5690414  -1.465   0.1436  
stenose100% (Occlusion)   -1.3089080  0.6810469  -1.922   0.0552 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9653 on 462 degrees of freedom
Multiple R-squared:  0.03962,   Adjusted R-squared:  0.004284 
F-statistic: 1.121 on 17 and 462 DF,  p-value: 0.3297

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: -0.068542 
Standard error............: 0.041736 
Odds ratio (effect size)..: 0.934 
Lower 95% CI..............: 0.86 
Upper 95% CI..............: 1.013 
T-value...................: -1.64227 
P-value...................: 0.1012144 
R^2.......................: 0.039622 
Adjusted r^2..............: 0.004284 
Sample size of AE DB......: 2388 
Sample size of model......: 480 
Missing data %............: 79.8995 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ Gender + Med.Statin.LLD + 
    BMI + CAD_history, data = currentDF)

Coefficients:
      (Intercept)         Gendermale  Med.Statin.LLDyes                BMI        CAD_history  
          0.62797           -0.14791           -0.17078           -0.01678            0.18459  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.10464 -0.69874  0.03157  0.67237  3.02975 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                2.0177233  0.8817683   2.288   0.0226 *
currentDF[, TRAIT]         0.0247937  0.0442872   0.560   0.5759  
Age                       -0.0062426  0.0059358  -1.052   0.2935  
Gendermale                -0.1471284  0.1039038  -1.416   0.1575  
Hypertension.compositeyes  0.0194356  0.1356093   0.143   0.8861  
DiabetesStatusDiabetes    -0.0182235  0.1157824  -0.157   0.8750  
SmokerCurrentyes           0.0278929  0.0989731   0.282   0.7782  
Med.Statin.LLDyes         -0.1848209  0.1040135  -1.777   0.0762 .
Med.all.antiplateletyes   -0.2376107  0.1622751  -1.464   0.1438  
GFR_MDRD                   0.0005086  0.0026001   0.196   0.8450  
BMI                       -0.0174703  0.0124984  -1.398   0.1628  
CAD_history                0.1915058  0.1021081   1.876   0.0614 .
Stroke_history             0.0570212  0.0971729   0.587   0.5576  
Peripheral.interv          0.0059065  0.1162497   0.051   0.9595  
stenose50-70%             -0.8228165  0.6236546  -1.319   0.1877  
stenose70-90%             -0.8299597  0.5757742  -1.441   0.1501  
stenose90-99%             -0.7914493  0.5736687  -1.380   0.1684  
stenose100% (Occlusion)   -1.2535737  0.6865446  -1.826   0.0685 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9735 on 459 degrees of freedom
Multiple R-squared:  0.03312,   Adjusted R-squared:  -0.002686 
F-statistic: 0.925 on 17 and 459 DF,  p-value: 0.5443

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: 0.024794 
Standard error............: 0.044287 
Odds ratio (effect size)..: 1.025 
Lower 95% CI..............: 0.94 
Upper 95% CI..............: 1.118 
T-value...................: 0.55984 
P-value...................: 0.5758615 
R^2.......................: 0.033124 
Adjusted r^2..............: -0.002686 
Sample size of AE DB......: 2388 
Sample size of model......: 477 
Missing data %............: 80.02513 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ Med.Statin.LLD + Med.all.antiplatelet + 
    CAD_history, data = currentDF)

Coefficients:
            (Intercept)        Med.Statin.LLDyes  Med.all.antiplateletyes              CAD_history  
                 0.2792                  -0.1532                  -0.2243                   0.1419  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.09803 -0.68750  0.01001  0.67790  3.09629 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                1.9561136  0.8855768   2.209   0.0277 *
currentDF[, TRAIT]        -0.0323443  0.0567070  -0.570   0.5687  
Age                       -0.0071652  0.0058979  -1.215   0.2250  
Gendermale                -0.1413460  0.1036164  -1.364   0.1732  
Hypertension.compositeyes  0.0500332  0.1385484   0.361   0.7182  
DiabetesStatusDiabetes    -0.0297531  0.1175472  -0.253   0.8003  
SmokerCurrentyes           0.0287580  0.0998963   0.288   0.7736  
Med.Statin.LLDyes         -0.1881625  0.1043566  -1.803   0.0720 .
Med.all.antiplateletyes   -0.2581952  0.1641560  -1.573   0.1164  
GFR_MDRD                   0.0006495  0.0026302   0.247   0.8051  
BMI                       -0.0144740  0.0127453  -1.136   0.2567  
CAD_history                0.1948838  0.1024046   1.903   0.0577 .
Stroke_history             0.0843472  0.0983333   0.858   0.3915  
Peripheral.interv          0.0036368  0.1168602   0.031   0.9752  
stenose50-70%             -0.7800714  0.6238008  -1.251   0.2118  
stenose70-90%             -0.8067160  0.5767651  -1.399   0.1626  
stenose90-99%             -0.7793910  0.5748524  -1.356   0.1758  
stenose100% (Occlusion)   -0.9176088  0.7281714  -1.260   0.2083  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9754 on 452 degrees of freedom
Multiple R-squared:  0.03081,   Adjusted R-squared:  -0.005638 
F-statistic: 0.8453 on 17 and 452 DF,  p-value: 0.64

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.032344 
Standard error............: 0.056707 
Odds ratio (effect size)..: 0.968 
Lower 95% CI..............: 0.866 
Upper 95% CI..............: 1.082 
T-value...................: -0.570376 
P-value...................: 0.5687063 
R^2.......................: 0.030814 
Adjusted r^2..............: -0.005638 
Sample size of AE DB......: 2388 
Sample size of model......: 470 
Missing data %............: 80.31826 

Analysis of MCP1_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + Med.Statin.LLD + Med.all.antiplatelet, 
    data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age                 Gendermale  Hypertension.compositeyes  
                 0.371369                   0.098495                  -0.007782                   0.304434                  -0.224359  
        Med.Statin.LLDyes    Med.all.antiplateletyes  
                -0.214084                   0.325933  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-3.04992 -0.67471  0.01276  0.66488  2.76675 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)   
(Intercept)                1.175752   0.858226   1.370  0.17131   
currentDF[, TRAIT]         0.091886   0.040985   2.242  0.02541 * 
Age                       -0.011585   0.005692  -2.035  0.04237 * 
Gendermale                 0.290308   0.098872   2.936  0.00348 **
Hypertension.compositeyes -0.233518   0.132648  -1.760  0.07895 . 
DiabetesStatusDiabetes    -0.121623   0.110871  -1.097  0.27318   
SmokerCurrentyes          -0.062330   0.095859  -0.650  0.51585   
Med.Statin.LLDyes         -0.220521   0.101730  -2.168  0.03066 * 
Med.all.antiplateletyes    0.301211   0.154422   1.951  0.05167 . 
GFR_MDRD                  -0.001676   0.002477  -0.677  0.49899   
BMI                       -0.012215   0.011885  -1.028  0.30455   
CAD_history                0.110540   0.099554   1.110  0.26739   
Stroke_history             0.115056   0.093287   1.233  0.21803   
Peripheral.interv         -0.150917   0.117008  -1.290  0.19772   
stenose50-70%             -0.280324   0.622960  -0.450  0.65292   
stenose70-90%             -0.054810   0.578053  -0.095  0.92450   
stenose90-99%             -0.042985   0.576571  -0.075  0.94060   
stenose100% (Occlusion)   -0.487945   0.729821  -0.669  0.50407   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9798 on 495 degrees of freedom
Multiple R-squared:  0.07266,   Adjusted R-squared:  0.04081 
F-statistic: 2.282 on 17 and 495 DF,  p-value: 0.002535

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.091886 
Standard error............: 0.040985 
Odds ratio (effect size)..: 1.096 
Lower 95% CI..............: 1.012 
Upper 95% CI..............: 1.188 
T-value...................: 2.241938 
P-value...................: 0.02540749 
R^2.......................: 0.072662 
Adjusted r^2..............: 0.040814 
Sample size of AE DB......: 2388 
Sample size of model......: 513 
Missing data %............: 78.51759 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + Med.Statin.LLD + Med.all.antiplatelet + 
    CAD_history, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]                        Age                 Gendermale  Hypertension.compositeyes  
                  0.79555                   -0.18754                   -0.01327                    0.22987                   -0.22144  
        Med.Statin.LLDyes    Med.all.antiplateletyes                CAD_history  
                 -0.22763                    0.32134                    0.13508  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.82157 -0.67164 -0.01232  0.64680  2.51654 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                1.516767   0.843745   1.798  0.07284 .  
currentDF[, TRAIT]        -0.184221   0.041848  -4.402 1.32e-05 ***
Age                       -0.016216   0.005685  -2.853  0.00452 ** 
Gendermale                 0.227577   0.098012   2.322  0.02064 *  
Hypertension.compositeyes -0.217011   0.129139  -1.680  0.09351 .  
DiabetesStatusDiabetes    -0.111461   0.108990  -1.023  0.30697    
SmokerCurrentyes          -0.064436   0.093923  -0.686  0.49300    
Med.Statin.LLDyes         -0.226750   0.100142  -2.264  0.02399 *  
Med.all.antiplateletyes    0.292797   0.151249   1.936  0.05346 .  
GFR_MDRD                  -0.001337   0.002428  -0.551  0.58211    
BMI                       -0.011722   0.011633  -1.008  0.31411    
CAD_history                0.166154   0.097613   1.702  0.08935 .  
Stroke_history             0.113839   0.091470   1.245  0.21389    
Peripheral.interv         -0.131918   0.115289  -1.144  0.25308    
stenose50-70%             -0.246421   0.610039  -0.404  0.68643    
stenose70-90%             -0.055765   0.566182  -0.098  0.92158    
stenose90-99%             -0.067374   0.564421  -0.119  0.90503    
stenose100% (Occlusion)   -0.599452   0.714404  -0.839  0.40182    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9594 on 492 degrees of freedom
Multiple R-squared:  0.09563,   Adjusted R-squared:  0.06438 
F-statistic:  3.06 on 17 and 492 DF,  p-value: 3.937e-05

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.184221 
Standard error............: 0.041848 
Odds ratio (effect size)..: 0.832 
Lower 95% CI..............: 0.766 
Upper 95% CI..............: 0.903 
T-value...................: -4.402188 
P-value...................: 1.315371e-05 
R^2.......................: 0.095625 
Adjusted r^2..............: 0.064376 
Sample size of AE DB......: 2388 
Sample size of model......: 510 
Missing data %............: 78.64322 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Med.Statin.LLD + Med.all.antiplatelet, data = currentDF)

Coefficients:
            (Intercept)       currentDF[, TRAIT]                      Age               Gendermale        Med.Statin.LLDyes  
                0.30680                 -0.09313                 -0.00927                  0.32989                 -0.22147  
Med.all.antiplateletyes  
                0.32424  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-3.08723 -0.66290 -0.00982  0.64415  2.61016 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)   
(Intercept)                1.081798   0.865574   1.250  0.21197   
currentDF[, TRAIT]        -0.098755   0.054234  -1.821  0.06924 . 
Age                       -0.012056   0.005761  -2.093  0.03690 * 
Gendermale                 0.311368   0.100077   3.111  0.00197 **
Hypertension.compositeyes -0.171260   0.135231  -1.266  0.20597   
DiabetesStatusDiabetes    -0.094615   0.112880  -0.838  0.40234   
SmokerCurrentyes          -0.067259   0.097251  -0.692  0.48951   
Med.Statin.LLDyes         -0.226120   0.102933  -2.197  0.02851 * 
Med.all.antiplateletyes    0.297676   0.156807   1.898  0.05824 . 
GFR_MDRD                  -0.001178   0.002544  -0.463  0.64359   
BMI                       -0.009717   0.012040  -0.807  0.42001   
CAD_history                0.136143   0.100924   1.349  0.17798   
Stroke_history             0.120457   0.094866   1.270  0.20478   
Peripheral.interv         -0.133039   0.118703  -1.121  0.26294   
stenose50-70%             -0.359473   0.625133  -0.575  0.56553   
stenose70-90%             -0.053904   0.580427  -0.093  0.92605   
stenose90-99%             -0.062723   0.578764  -0.108  0.91374   
stenose100% (Occlusion)   -0.550773   0.732645  -0.752  0.45256   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9835 on 485 degrees of freedom
Multiple R-squared:  0.06824,   Adjusted R-squared:  0.03558 
F-statistic: 2.089 on 17 and 485 DF,  p-value: 0.006596

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.098755 
Standard error............: 0.054234 
Odds ratio (effect size)..: 0.906 
Lower 95% CI..............: 0.815 
Upper 95% CI..............: 1.008 
T-value...................: -1.820907 
P-value...................: 0.06923707 
R^2.......................: 0.068242 
Adjusted r^2..............: 0.035582 
Sample size of AE DB......: 2388 
Sample size of model......: 503 
Missing data %............: 78.93635 

Analysis of IL6_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + CAD_history + 
    Stroke_history + Peripheral.interv, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]         CAD_history      Stroke_history   Peripheral.interv  
           0.01886             0.09601            -0.14506             0.18452            -0.14721  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1909 -0.6764  0.0049  0.6426  3.4119 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)   
(Intercept)                0.598104   0.634370   0.943  0.34600   
currentDF[, TRAIT]         0.093832   0.031754   2.955  0.00320 **
Age                       -0.003879   0.003906  -0.993  0.32090   
Gendermale                 0.009744   0.069831   0.140  0.88906   
Hypertension.compositeyes -0.100809   0.097138  -1.038  0.29962   
DiabetesStatusDiabetes    -0.008597   0.076764  -0.112  0.91086   
SmokerCurrentyes           0.064296   0.070471   0.912  0.36179   
Med.Statin.LLDyes         -0.064710   0.076835  -0.842  0.39988   
Med.all.antiplateletyes    0.011430   0.104312   0.110  0.91277   
GFR_MDRD                  -0.002656   0.001676  -1.585  0.11323   
BMI                       -0.008334   0.008727  -0.955  0.33981   
CAD_history               -0.108752   0.072191  -1.506  0.13228   
Stroke_history             0.188239   0.067608   2.784  0.00547 **
Peripheral.interv         -0.149582   0.083267  -1.796  0.07274 . 
stenose50-70%             -0.037014   0.459362  -0.081  0.93579   
stenose70-90%              0.226650   0.444258   0.510  0.61004   
stenose90-99%              0.173795   0.444035   0.391  0.69559   
stenose100% (Occlusion)    0.562595   0.564475   0.997  0.31917   
stenose50-99%              0.021481   0.824910   0.026  0.97923   
stenose70-99%             -0.186502   0.598315  -0.312  0.75533   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.984 on 976 degrees of freedom
Multiple R-squared:  0.04085,   Adjusted R-squared:  0.02218 
F-statistic: 2.188 on 19 and 976 DF,  p-value: 0.002371

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.093832 
Standard error............: 0.031754 
Odds ratio (effect size)..: 1.098 
Lower 95% CI..............: 1.032 
Upper 95% CI..............: 1.169 
T-value...................: 2.954983 
P-value...................: 0.003201987 
R^2.......................: 0.040848 
Adjusted r^2..............: 0.022176 
Sample size of AE DB......: 2388 
Sample size of model......: 996 
Missing data %............: 58.29146 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    CAD_history + Stroke_history + Peripheral.interv, data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]                 Age         CAD_history      Stroke_history   Peripheral.interv  
          0.510465           -0.157509           -0.007324           -0.123126            0.197685           -0.159919  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.93275 -0.66240  0.01907  0.64346  2.96767 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                0.786671   0.630026   1.249  0.21210    
currentDF[, TRAIT]        -0.162944   0.032868  -4.958 8.42e-07 ***
Age                       -0.008232   0.003918  -2.101  0.03587 *  
Gendermale                -0.033556   0.070213  -0.478  0.63282    
Hypertension.compositeyes -0.086195   0.096425  -0.894  0.37159    
DiabetesStatusDiabetes    -0.004985   0.076199  -0.065  0.94785    
SmokerCurrentyes           0.060184   0.069997   0.860  0.39011    
Med.Statin.LLDyes         -0.065859   0.076396  -0.862  0.38886    
Med.all.antiplateletyes   -0.016292   0.103511  -0.157  0.87497    
GFR_MDRD                  -0.002233   0.001666  -1.341  0.18034    
BMI                       -0.007551   0.008672  -0.871  0.38410    
CAD_history               -0.090057   0.071752  -1.255  0.20974    
Stroke_history             0.197606   0.067061   2.947  0.00329 ** 
Peripheral.interv         -0.161279   0.083037  -1.942  0.05240 .  
stenose50-70%              0.023861   0.455875   0.052  0.95827    
stenose70-90%              0.318075   0.440924   0.721  0.47085    
stenose90-99%              0.277050   0.440793   0.629  0.52981    
stenose100% (Occlusion)    0.626538   0.560171   1.118  0.26364    
stenose50-99%              0.198613   0.819108   0.242  0.80846    
stenose70-99%             -0.083839   0.593759  -0.141  0.88774    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9761 on 972 degrees of freedom
Multiple R-squared:  0.05658,   Adjusted R-squared:  0.03814 
F-statistic: 3.068 on 19 and 972 DF,  p-value: 1.101e-05

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.162944 
Standard error............: 0.032868 
Odds ratio (effect size)..: 0.85 
Lower 95% CI..............: 0.797 
Upper 95% CI..............: 0.906 
T-value...................: -4.957502 
P-value...................: 8.422128e-07 
R^2.......................: 0.056578 
Adjusted r^2..............: 0.038137 
Sample size of AE DB......: 2388 
Sample size of model......: 992 
Missing data %............: 58.45896 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + SmokerCurrent + 
    GFR_MDRD + CAD_history + Stroke_history + Peripheral.interv, 
    data = currentDF)

Coefficients:
       (Intercept)  currentDF[, TRAIT]    SmokerCurrentyes            GFR_MDRD         CAD_history      Stroke_history  
          0.146966           -0.066091            0.105951           -0.002514           -0.129845            0.190585  
 Peripheral.interv  
         -0.173758  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1508 -0.6383  0.0036  0.6501  3.2094 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)   
(Intercept)                0.665290   0.649313   1.025  0.30582   
currentDF[, TRAIT]        -0.068097   0.033572  -2.028  0.04281 * 
Age                       -0.004320   0.004054  -1.066  0.28681   
Gendermale                 0.003466   0.072569   0.048  0.96192   
Hypertension.compositeyes -0.106848   0.100976  -1.058  0.29026   
DiabetesStatusDiabetes    -0.050711   0.081619  -0.621  0.53454   
SmokerCurrentyes           0.062220   0.073689   0.844  0.39869   
Med.Statin.LLDyes         -0.055150   0.079291  -0.696  0.48690   
Med.all.antiplateletyes   -0.017531   0.109861  -0.160  0.87325   
GFR_MDRD                  -0.003260   0.001759  -1.853  0.06418 . 
BMI                       -0.005782   0.009030  -0.640  0.52214   
CAD_history               -0.094898   0.075609  -1.255  0.20976   
Stroke_history             0.207070   0.070464   2.939  0.00338 **
Peripheral.interv         -0.166293   0.088420  -1.881  0.06033 . 
stenose50-70%             -0.128577   0.465413  -0.276  0.78241   
stenose70-90%              0.179173   0.448315   0.400  0.68950   
stenose90-99%              0.140252   0.447728   0.313  0.75416   
stenose100% (Occlusion)    0.489070   0.569196   0.859  0.39044   
stenose50-99%              0.015460   0.830783   0.019  0.98516   
stenose70-99%             -0.455543   0.667542  -0.682  0.49515   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9909 on 910 degrees of freedom
Multiple R-squared:  0.03919,   Adjusted R-squared:  0.01913 
F-statistic: 1.953 on 19 and 910 DF,  p-value: 0.008611

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.068097 
Standard error............: 0.033572 
Odds ratio (effect size)..: 0.934 
Lower 95% CI..............: 0.875 
Upper 95% CI..............: 0.998 
T-value...................: -2.02839 
P-value...................: 0.04281124 
R^2.......................: 0.039187 
Adjusted r^2..............: 0.019126 
Sample size of AE DB......: 2388 
Sample size of model......: 930 
Missing data %............: 61.05528 

Analysis of IL6R_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Med.Statin.LLD + GFR_MDRD + CAD_history + Peripheral.interv + 
    stenose, data = currentDF)

Coefficients:
            (Intercept)       currentDF[, TRAIT]                      Age        Med.Statin.LLDyes                 GFR_MDRD  
               0.254402                 0.138291                -0.008368                -0.371568                -0.003134  
            CAD_history        Peripheral.interv            stenose50-70%            stenose70-90%            stenose90-99%  
              -0.099103                 0.233323                 0.518699                 0.800413                 0.942022  
stenose100% (Occlusion)            stenose50-99%            stenose70-99%  
               0.655301                 0.565404                -0.108615  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.1926 -0.6496 -0.0011  0.6198  3.0610 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                0.274225   0.663148   0.414  0.67932    
currentDF[, TRAIT]         0.139450   0.030997   4.499 7.65e-06 ***
Age                       -0.007934   0.003880  -2.045  0.04117 *  
Gendermale                -0.058157   0.068901  -0.844  0.39884    
Hypertension.compositeyes  0.055508   0.095193   0.583  0.55996    
DiabetesStatusDiabetes    -0.077646   0.075649  -1.026  0.30496    
SmokerCurrentyes           0.059294   0.069374   0.855  0.39293    
Med.Statin.LLDyes         -0.373281   0.076205  -4.898 1.13e-06 ***
Med.all.antiplateletyes    0.038778   0.103983   0.373  0.70928    
GFR_MDRD                  -0.003053   0.001682  -1.815  0.06981 .  
BMI                       -0.005349   0.008797  -0.608  0.54328    
CAD_history               -0.074440   0.070919  -1.050  0.29414    
Stroke_history             0.067980   0.066451   1.023  0.30656    
Peripheral.interv          0.233457   0.082462   2.831  0.00473 ** 
stenose50-70%              0.533224   0.503840   1.058  0.29017    
stenose70-90%              0.814412   0.489795   1.663  0.09668 .  
stenose90-99%              0.950282   0.489612   1.941  0.05256 .  
stenose100% (Occlusion)    0.670810   0.598031   1.122  0.26227    
stenose50-99%              0.538437   0.687643   0.783  0.43381    
stenose70-99%             -0.113878   0.629316  -0.181  0.85644    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9703 on 979 degrees of freedom
Multiple R-squared:  0.08311,   Adjusted R-squared:  0.06531 
F-statistic:  4.67 on 19 and 979 DF,  p-value: 1.919e-10

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: 0.13945 
Standard error............: 0.030997 
Odds ratio (effect size)..: 1.15 
Lower 95% CI..............: 1.082 
Upper 95% CI..............: 1.222 
T-value...................: 4.498795 
P-value...................: 7.653324e-06 
R^2.......................: 0.083108 
Adjusted r^2..............: 0.065313 
Sample size of AE DB......: 2388 
Sample size of model......: 999 
Missing data %............: 58.16583 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Med.Statin.LLD + GFR_MDRD + Stroke_history + Peripheral.interv + 
    stenose, data = currentDF)

Coefficients:
            (Intercept)       currentDF[, TRAIT]                      Age        Med.Statin.LLDyes                 GFR_MDRD  
               0.190698                 0.062823                -0.008893                -0.373218                -0.002728  
         Stroke_history        Peripheral.interv            stenose50-70%            stenose70-90%            stenose90-99%  
               0.096206                 0.210013                 0.503849                 0.820847                 0.949222  
stenose100% (Occlusion)            stenose50-99%            stenose70-99%  
               0.641657                 0.513585                -0.128979  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3384 -0.6634  0.0112  0.6148  3.0952 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                0.231609   0.669488   0.346  0.72945    
currentDF[, TRAIT]         0.063184   0.032805   1.926  0.05439 .  
Age                       -0.008096   0.003958  -2.046  0.04107 *  
Gendermale                -0.011671   0.070307  -0.166  0.86819    
Hypertension.compositeyes  0.055446   0.096058   0.577  0.56393    
DiabetesStatusDiabetes    -0.086441   0.076316  -1.133  0.25763    
SmokerCurrentyes           0.041023   0.070053   0.586  0.55828    
Med.Statin.LLDyes         -0.358662   0.077004  -4.658 3.64e-06 ***
Med.all.antiplateletyes    0.027783   0.104869   0.265  0.79111    
GFR_MDRD                  -0.003029   0.001699  -1.782  0.07499 .  
BMI                       -0.005242   0.008888  -0.590  0.55546    
CAD_history               -0.074743   0.071673  -1.043  0.29728    
Stroke_history             0.082865   0.067031   1.236  0.21668    
Peripheral.interv          0.221438   0.083614   2.648  0.00822 ** 
stenose50-70%              0.529972   0.508326   1.043  0.29740    
stenose70-90%              0.840789   0.494103   1.702  0.08914 .  
stenose90-99%              0.964938   0.494012   1.953  0.05107 .  
stenose100% (Occlusion)    0.633483   0.603460   1.050  0.29409    
stenose50-99%              0.515776   0.693804   0.743  0.45742    
stenose70-99%             -0.098253   0.634854  -0.155  0.87704    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9785 on 975 degrees of freedom
Multiple R-squared:  0.06621,   Adjusted R-squared:  0.04801 
F-statistic: 3.638 on 19 and 975 DF,  p-value: 2.505e-07

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: 0.063184 
Standard error............: 0.032805 
Odds ratio (effect size)..: 1.065 
Lower 95% CI..............: 0.999 
Upper 95% CI..............: 1.136 
T-value...................: 1.926004 
P-value...................: 0.05439434 
R^2.......................: 0.066208 
Adjusted r^2..............: 0.048011 
Sample size of AE DB......: 2388 
Sample size of model......: 995 
Missing data %............: 58.33333 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    DiabetesStatus + Med.Statin.LLD + GFR_MDRD + CAD_history + 
    Peripheral.interv + stenose, data = currentDF)

Coefficients:
            (Intercept)       currentDF[, TRAIT]                      Age   DiabetesStatusDiabetes        Med.Statin.LLDyes  
               0.320815                 0.075290                -0.010262                -0.132040                -0.344402  
               GFR_MDRD              CAD_history        Peripheral.interv            stenose50-70%            stenose70-90%  
              -0.003693                -0.111030                 0.215654                 0.616697                 0.932206  
          stenose90-99%  stenose100% (Occlusion)            stenose50-99%            stenose70-99%  
               1.048426                 0.702021                 0.580092                 0.024660  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3853 -0.6424 -0.0008  0.5946  3.0704 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                0.373101   0.681739   0.547  0.58432    
currentDF[, TRAIT]         0.072980   0.033447   2.182  0.02937 *  
Age                       -0.010508   0.004055  -2.591  0.00971 ** 
Gendermale                -0.045887   0.071954  -0.638  0.52381    
Hypertension.compositeyes  0.058845   0.099784   0.590  0.55552    
DiabetesStatusDiabetes    -0.127065   0.080829  -1.572  0.11629    
SmokerCurrentyes           0.028334   0.072970   0.388  0.69789    
Med.Statin.LLDyes         -0.349043   0.079153  -4.410 1.16e-05 ***
Med.all.antiplateletyes   -0.007124   0.110152  -0.065  0.94844    
GFR_MDRD                  -0.003437   0.001780  -1.931  0.05382 .  
BMI                       -0.003941   0.009220  -0.427  0.66914    
CAD_history               -0.096726   0.074536  -1.298  0.19472    
Stroke_history             0.080324   0.069644   1.153  0.24907    
Peripheral.interv          0.214445   0.087779   2.443  0.01475 *  
stenose50-70%              0.614862   0.512332   1.200  0.23040    
stenose70-90%              0.932201   0.496101   1.879  0.06056 .  
stenose90-99%              1.047922   0.495616   2.114  0.03475 *  
stenose100% (Occlusion)    0.712439   0.605740   1.176  0.23984    
stenose50-99%              0.549565   0.695939   0.790  0.42992    
stenose70-99%              0.027142   0.697472   0.039  0.96897    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9817 on 912 degrees of freedom
Multiple R-squared:  0.06911,   Adjusted R-squared:  0.04972 
F-statistic: 3.564 on 19 and 912 DF,  p-value: 4.323e-07

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: 0.07298 
Standard error............: 0.033447 
Odds ratio (effect size)..: 1.076 
Lower 95% CI..............: 1.007 
Upper 95% CI..............: 1.149 
T-value...................: 2.181987 
P-value...................: 0.02936508 
R^2.......................: 0.069115 
Adjusted r^2..............: 0.049721 
Sample size of AE DB......: 2388 
Sample size of model......: 932 
Missing data %............: 60.97152 

Analysis of MCP1_pg_ug_2015_rank.

- processing Macrophages_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Hypertension.composite + 
    Med.Statin.LLD + Stroke_history, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]  Hypertension.compositeyes          Med.Statin.LLDyes             Stroke_history  
                  0.26759                   -0.05375                   -0.20588                   -0.15187                    0.10863  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3648 -0.6660 -0.0273  0.6576  3.2393 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)                0.2124414  0.6391679   0.332   0.7397  
currentDF[, TRAIT]        -0.0594184  0.0313284  -1.897   0.0582 .
Age                       -0.0020052  0.0038961  -0.515   0.6069  
Gendermale                 0.0857202  0.0691441   1.240   0.2154  
Hypertension.compositeyes -0.1946501  0.0966828  -2.013   0.0443 *
DiabetesStatusDiabetes    -0.0356636  0.0763648  -0.467   0.6406  
SmokerCurrentyes          -0.0229331  0.0699413  -0.328   0.7431  
Med.Statin.LLDyes         -0.1530759  0.0772298  -1.982   0.0477 *
Med.all.antiplateletyes   -0.0060653  0.1048021  -0.058   0.9539  
GFR_MDRD                  -0.0007891  0.0016718  -0.472   0.6370  
BMI                       -0.0033761  0.0086790  -0.389   0.6974  
CAD_history               -0.0429034  0.0715219  -0.600   0.5487  
Stroke_history             0.1049280  0.0673948   1.557   0.1198  
Peripheral.interv          0.0201952  0.0827808   0.244   0.8073  
stenose50-70%              0.2746486  0.4665000   0.589   0.5562  
stenose70-90%              0.3718106  0.4510306   0.824   0.4099  
stenose90-99%              0.2388238  0.4508856   0.530   0.5965  
stenose100% (Occlusion)   -0.1876128  0.5732084  -0.327   0.7435  
stenose50-99%              0.5643377  0.6719949   0.840   0.4012  
stenose70-99%              0.5005227  0.6075952   0.824   0.4103  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9995 on 1017 degrees of freedom
Multiple R-squared:  0.02434,   Adjusted R-squared:  0.006109 
F-statistic: 1.335 on 19 and 1017 DF,  p-value: 0.152

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' Macrophages_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: Macrophages_rank 
Effect size...............: -0.059418 
Standard error............: 0.031328 
Odds ratio (effect size)..: 0.942 
Lower 95% CI..............: 0.886 
Upper 95% CI..............: 1.002 
T-value...................: -1.896633 
P-value...................: 0.05815957 
R^2.......................: 0.024337 
Adjusted r^2..............: 0.006109 
Sample size of AE DB......: 2388 
Sample size of model......: 1037 
Missing data %............: 56.57454 

- processing SMC_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Hypertension.composite + 
    Med.Statin.LLD + Stroke_history, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]  Hypertension.compositeyes          Med.Statin.LLDyes             Stroke_history  
                  0.27925                   -0.10750                   -0.20781                   -0.15930                    0.09907  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3724 -0.6767 -0.0304  0.6444  3.2770 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)   
(Intercept)                0.290952   0.638800   0.455  0.64887   
currentDF[, TRAIT]        -0.107077   0.032598  -3.285  0.00106 **
Age                       -0.003437   0.003929  -0.875  0.38199   
Gendermale                 0.040662   0.069945   0.581  0.56115   
Hypertension.compositeyes -0.190633   0.096558  -1.974  0.04862 * 
DiabetesStatusDiabetes    -0.029269   0.076250  -0.384  0.70116   
SmokerCurrentyes          -0.017656   0.069895  -0.253  0.80062   
Med.Statin.LLDyes         -0.166237   0.077217  -2.153  0.03157 * 
Med.all.antiplateletyes   -0.011125   0.104641  -0.106  0.91535   
GFR_MDRD                  -0.000614   0.001672  -0.367  0.71354   
BMI                       -0.003254   0.008677  -0.375  0.70773   
CAD_history               -0.036723   0.071522  -0.513  0.60775   
Stroke_history             0.097831   0.067275   1.454  0.14620   
Peripheral.interv          0.024988   0.083042   0.301  0.76354   
stenose50-70%              0.320528   0.465811   0.688  0.49154   
stenose70-90%              0.410560   0.450412   0.912  0.36224   
stenose90-99%              0.287171   0.450366   0.638  0.52385   
stenose100% (Occlusion)   -0.118251   0.572338  -0.207  0.83636   
stenose50-99%              0.632607   0.670986   0.943  0.34601   
stenose70-99%              0.549146   0.606689   0.905  0.36560   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9976 on 1013 degrees of freedom
Multiple R-squared:  0.031, Adjusted R-squared:  0.01282 
F-statistic: 1.705 on 19 and 1013 DF,  p-value: 0.02996

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' SMC_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: SMC_rank 
Effect size...............: -0.107077 
Standard error............: 0.032598 
Odds ratio (effect size)..: 0.898 
Lower 95% CI..............: 0.843 
Upper 95% CI..............: 0.958 
T-value...................: -3.284785 
P-value...................: 0.001055572 
R^2.......................: 0.030996 
Adjusted r^2..............: 0.012821 
Sample size of AE DB......: 2388 
Sample size of model......: 1033 
Missing data %............: 56.74204 

- processing VesselDensity_rank


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Hypertension.composite + 
    Med.Statin.LLD + Stroke_history, data = currentDF)

Coefficients:
              (Intercept)         currentDF[, TRAIT]  Hypertension.compositeyes          Med.Statin.LLDyes             Stroke_history  
                   0.2520                    -0.1458                    -0.1882                    -0.1728                     0.1253  


Call:
lm(formula = currentDF[, PROTEIN] ~ currentDF[, TRAIT] + Age + 
    Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
    Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
    CAD_history + Stroke_history + Peripheral.interv + stenose, 
    data = currentDF)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.2433 -0.6661 -0.0246  0.6386  3.3145 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                0.211623   0.650353   0.325   0.7450    
currentDF[, TRAIT]        -0.142888   0.033041  -4.325 1.69e-05 ***
Age                       -0.001066   0.004023  -0.265   0.7910    
Gendermale                 0.102130   0.071463   1.429   0.1533    
Hypertension.compositeyes -0.184342   0.100225  -1.839   0.0662 .  
DiabetesStatusDiabetes    -0.041305   0.080612  -0.512   0.6085    
SmokerCurrentyes          -0.012813   0.072721  -0.176   0.8602    
Med.Statin.LLDyes         -0.172532   0.079341  -2.175   0.0299 *  
Med.all.antiplateletyes    0.032519   0.109658   0.297   0.7669    
GFR_MDRD                  -0.001284   0.001744  -0.736   0.4619    
BMI                       -0.002257   0.008979  -0.251   0.8016    
CAD_history               -0.038172   0.074308  -0.514   0.6076    
Stroke_history             0.119804   0.069831   1.716   0.0866 .  
Peripheral.interv          0.002460   0.087239   0.028   0.9775    
stenose50-70%              0.112862   0.469976   0.240   0.8103    
stenose70-90%              0.252067   0.452625   0.557   0.5777    
stenose90-99%              0.135540   0.452129   0.300   0.7644    
stenose100% (Occlusion)   -0.268393   0.574820  -0.467   0.6407    
stenose50-99%              0.600081   0.673103   0.892   0.3729    
stenose70-99%              0.162929   0.674146   0.242   0.8091    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.001 on 949 degrees of freedom
Multiple R-squared:  0.0426,    Adjusted R-squared:  0.02343 
F-statistic: 2.222 on 19 and 949 DF,  p-value: 0.001956

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' VesselDensity_rank ' .
Collecting data.

We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: VesselDensity_rank 
Effect size...............: -0.142888 
Standard error............: 0.033041 
Odds ratio (effect size)..: 0.867 
Lower 95% CI..............: 0.812 
Upper 95% CI..............: 0.925 
T-value...................: -4.324596 
P-value...................: 1.689717e-05 
R^2.......................: 0.0426 
Adjusted r^2..............: 0.023432 
Sample size of AE DB......: 2388 
Sample size of model......: 969 
Missing data %............: 59.42211 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Con.Multi.Protein.PlaquePhenotypes.RANK.MODEL2.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Con.Multi.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Binary plaque traits

Analysis of binary plaque traits as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(TRAITS.BIN)) {
    TRAIT = TRAITS.BIN[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate
    fit <- glm(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender + 
                Hypertension.composite + DiabetesStatus + SmokerCurrent + 
                Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
                CAD_history + Stroke_history + Peripheral.interv + stenose, 
              data  =  currentDF, family = binomial(link = "logit"))
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 16, nrow = 0))
    GLM.results.TEMP[1,] = GLM.BIN(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}

Analysis of IL6_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    GFR_MDRD + Stroke_history, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]              GFR_MDRD        Stroke_history  
             1.13102               0.16676              -0.01009              -0.39756  

Degrees of Freedom: 480 Total (i.e. Null);  477 Residual
Null Deviance:      656.9 
Residual Deviance: 646.2    AIC: 654.2

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8778  -1.2477   0.8434   1.0452   1.6363  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)  
(Intercept)               -1.142674   1.894433  -0.603   0.5464  
currentDF[, PROTEIN]       0.187641   0.099762   1.881   0.0600 .
Age                        0.005528   0.012359   0.447   0.6547  
Gendermale                -0.115162   0.218320  -0.527   0.5979  
Hypertension.compositeyes  0.476111   0.285756   1.666   0.0957 .
DiabetesStatusDiabetes    -0.321528   0.244112  -1.317   0.1878  
SmokerCurrentyes           0.107466   0.208795   0.515   0.6068  
Med.Statin.LLDyes          0.116419   0.219777   0.530   0.5963  
Med.all.antiplateletyes    0.394578   0.343182   1.150   0.2502  
GFR_MDRD                  -0.010480   0.005580  -1.878   0.0603 .
BMI                       -0.004079   0.026551  -0.154   0.8779  
CAD_history               -0.050297   0.216490  -0.232   0.8163  
Stroke_history            -0.449958   0.205657  -2.188   0.0287 *
Peripheral.interv         -0.283628   0.243087  -1.167   0.2433  
stenose50-70%              1.612811   1.359371   1.186   0.2354  
stenose70-90%              1.574761   1.264171   1.246   0.2129  
stenose90-99%              1.246104   1.258956   0.990   0.3223  
stenose100% (Occlusion)    1.636060   1.495055   1.094   0.2738  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 656.88  on 480  degrees of freedom
Residual deviance: 635.08  on 463  degrees of freedom
AIC: 671.08

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: 0.187641 
Standard error............: 0.099762 
Odds ratio (effect size)..: 1.206 
Lower 95% CI..............: 0.992 
Upper 95% CI..............: 1.467 
Z-value...................: 1.880896 
P-value...................: 0.05998602 
Hosmer and Lemeshow r^2...: 0.033177 
Cox and Snell r^2.........: 0.044296 
Nagelkerke's pseudo r^2...: 0.059475 
Sample size of AE DB......: 2388 
Sample size of model......: 481 
Missing data %............: 79.85762 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ SmokerCurrent + 
    Peripheral.interv + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)         SmokerCurrentyes        Peripheral.interv            stenose50-70%            stenose70-90%  
                16.6172                   0.5118                  -0.5187                  -0.1656                 -15.0805  
          stenose90-99%  stenose100% (Occlusion)  
               -15.4792                 -14.7976  

Degrees of Freedom: 479 Total (i.e. Null);  473 Residual
Null Deviance:      474.8 
Residual Deviance: 455.6    AIC: 469.6

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1410   0.4147   0.5880   0.7112   1.1491  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)  
(Intercept)                1.833e+01  2.202e+03   0.008   0.9934  
currentDF[, PROTEIN]      -1.131e-01  1.218e-01  -0.928   0.3532  
Age                       -5.156e-03  1.583e-02  -0.326   0.7447  
Gendermale                -1.905e-01  2.800e-01  -0.680   0.4962  
Hypertension.compositeyes  3.476e-01  3.454e-01   1.006   0.3142  
DiabetesStatusDiabetes     1.851e-01  3.131e-01   0.591   0.5545  
SmokerCurrentyes           5.231e-01  2.725e-01   1.920   0.0549 .
Med.Statin.LLDyes         -1.921e-02  2.739e-01  -0.070   0.9441  
Med.all.antiplateletyes    5.197e-01  3.990e-01   1.303   0.1927  
GFR_MDRD                  -4.836e-03  7.078e-03  -0.683   0.4945  
BMI                       -2.662e-02  3.364e-02  -0.791   0.4287  
CAD_history                9.202e-02  2.697e-01   0.341   0.7330  
Stroke_history             1.321e-01  2.634e-01   0.502   0.6159  
Peripheral.interv         -5.602e-01  2.846e-01  -1.969   0.0490 *
stenose50-70%             -1.090e-01  2.395e+03   0.000   1.0000  
stenose70-90%             -1.607e+01  2.202e+03  -0.007   0.9942  
stenose90-99%             -1.653e+01  2.202e+03  -0.008   0.9940  
stenose100% (Occlusion)   -1.556e+01  2.202e+03  -0.007   0.9944  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 474.79  on 479  degrees of freedom
Residual deviance: 449.41  on 462  degrees of freedom
AIC: 485.41

Number of Fisher Scoring iterations: 16

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.113087 
Standard error............: 0.121798 
Odds ratio (effect size)..: 0.893 
Lower 95% CI..............: 0.703 
Upper 95% CI..............: 1.134 
Z-value...................: -0.928484 
P-value...................: 0.3531568 
Hosmer and Lemeshow r^2...: 0.053459 
Cox and Snell r^2.........: 0.051505 
Nagelkerke's pseudo r^2...: 0.082 
Sample size of AE DB......: 2388 
Sample size of model......: 480 
Missing data %............: 79.8995 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Gender + Hypertension.composite + 
    DiabetesStatus + Stroke_history, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
              (Intercept)                 Gendermale  Hypertension.compositeyes     DiabetesStatusDiabetes             Stroke_history  
                   0.2536                     0.7695                     0.6023                    -0.5270                     0.7668  

Degrees of Freedom: 480 Total (i.e. Null);  476 Residual
Null Deviance:      483.6 
Residual Deviance: 459.4    AIC: 469.4

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4561   0.3832   0.5522   0.7048   1.3298  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                13.557573 833.530464   0.016 0.987023    
currentDF[, PROTEIN]        0.105467   0.121292   0.870 0.384555    
Age                        -0.008356   0.015529  -0.538 0.590504    
Gendermale                  0.854341   0.255518   3.344 0.000827 ***
Hypertension.compositeyes   0.653898   0.331496   1.973 0.048545 *  
DiabetesStatusDiabetes     -0.535682   0.288011  -1.860 0.062894 .  
SmokerCurrentyes            0.235127   0.266099   0.884 0.376909    
Med.Statin.LLDyes          -0.270417   0.289334  -0.935 0.349985    
Med.all.antiplateletyes     0.332141   0.405082   0.820 0.412253    
GFR_MDRD                   -0.004346   0.007159  -0.607 0.543790    
BMI                         0.025693   0.033034   0.778 0.436702    
CAD_history                -0.100692   0.271063  -0.371 0.710285    
Stroke_history              0.725302   0.285075   2.544 0.010951 *  
Peripheral.interv          -0.253404   0.288452  -0.878 0.379674    
stenose50-70%             -14.083308 833.528719  -0.017 0.986520    
stenose70-90%             -13.205044 833.528557  -0.016 0.987360    
stenose90-99%             -13.322823 833.528546  -0.016 0.987247    
stenose100% (Occlusion)   -12.920301 833.529308  -0.016 0.987633    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 483.60  on 480  degrees of freedom
Residual deviance: 450.33  on 463  degrees of freedom
AIC: 486.33

Number of Fisher Scoring iterations: 14

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.105467 
Standard error............: 0.121292 
Odds ratio (effect size)..: 1.111 
Lower 95% CI..............: 0.876 
Upper 95% CI..............: 1.409 
Z-value...................: 0.869535 
P-value...................: 0.3845546 
Hosmer and Lemeshow r^2...: 0.068787 
Cox and Snell r^2.........: 0.066821 
Nagelkerke's pseudo r^2...: 0.105379 
Sample size of AE DB......: 2388 
Sample size of model......: 481 
Missing data %............: 79.85762 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender + 
    DiabetesStatus + BMI + Peripheral.interv, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
           (Intercept)                     Age              Gendermale  DiabetesStatusDiabetes                     BMI  
              -2.71906                 0.03306                 0.64772                -0.58799                 0.04663  
     Peripheral.interv  
               0.47594  

Degrees of Freedom: 480 Total (i.e. Null);  475 Residual
Null Deviance:      538.2 
Residual Deviance: 514.6    AIC: 526.6

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1197   0.3817   0.6180   0.7868   1.3147  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)   
(Intercept)               -3.724347   2.077712  -1.793  0.07305 . 
currentDF[, PROTEIN]       0.031883   0.112786   0.283  0.77742   
Age                        0.029801   0.014081   2.116  0.03431 * 
Gendermale                 0.677626   0.239517   2.829  0.00467 **
Hypertension.compositeyes  0.362423   0.313321   1.157  0.24739   
DiabetesStatusDiabetes    -0.638623   0.268045  -2.383  0.01719 * 
SmokerCurrentyes           0.133395   0.241854   0.552  0.58125   
Med.Statin.LLDyes          0.051499   0.255894   0.201  0.84050   
Med.all.antiplateletyes   -0.278418   0.430917  -0.646  0.51821   
GFR_MDRD                  -0.004065   0.006460  -0.629  0.52923   
BMI                        0.046769   0.030726   1.522  0.12797   
CAD_history                0.176307   0.258493   0.682  0.49520   
Stroke_history             0.049418   0.239972   0.206  0.83685   
Peripheral.interv          0.442713   0.300800   1.472  0.14108   
stenose50-70%              1.305170   1.391394   0.938  0.34823   
stenose70-90%              1.209027   1.271245   0.951  0.34158   
stenose90-99%              1.359738   1.267498   1.073  0.28337   
stenose100% (Occlusion)    1.878451   1.699793   1.105  0.26911   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 538.20  on 480  degrees of freedom
Residual deviance: 509.11  on 463  degrees of freedom
AIC: 545.11

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.031883 
Standard error............: 0.112786 
Odds ratio (effect size)..: 1.032 
Lower 95% CI..............: 0.828 
Upper 95% CI..............: 1.288 
Z-value...................: 0.282686 
P-value...................: 0.7774176 
Hosmer and Lemeshow r^2...: 0.054057 
Cox and Snell r^2.........: 0.058693 
Nagelkerke's pseudo r^2...: 0.087163 
Sample size of AE DB......: 2388 
Sample size of model......: 481 
Missing data %............: 79.85762 

Analysis of MCP1_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    DiabetesStatus + GFR_MDRD + Stroke_history, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
           (Intercept)    currentDF[, PROTEIN]  DiabetesStatusDiabetes                GFR_MDRD          Stroke_history  
              1.192770               -0.151103               -0.450022               -0.009032               -0.335659  

Degrees of Freedom: 513 Total (i.e. Null);  509 Residual
Null Deviance:      698.1 
Residual Deviance: 685.4    AIC: 695.4

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6902  -1.2563   0.8474   1.0134   1.4941  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)  
(Intercept)               -1.341239   1.847433  -0.726   0.4678  
currentDF[, PROTEIN]      -0.143925   0.094902  -1.517   0.1294  
Age                        0.008539   0.012074   0.707   0.4794  
Gendermale                -0.133609   0.211820  -0.631   0.5282  
Hypertension.compositeyes  0.421229   0.275933   1.527   0.1269  
DiabetesStatusDiabetes    -0.491397   0.233262  -2.107   0.0351 *
SmokerCurrentyes           0.190422   0.202282   0.941   0.3465  
Med.Statin.LLDyes         -0.065611   0.216144  -0.304   0.7615  
Med.all.antiplateletyes    0.294148   0.328102   0.897   0.3700  
GFR_MDRD                  -0.008637   0.005278  -1.636   0.1018  
BMI                        0.006020   0.025217   0.239   0.8113  
CAD_history               -0.019955   0.210077  -0.095   0.9243  
Stroke_history            -0.382267   0.196922  -1.941   0.0522 .
Peripheral.interv         -0.296732   0.245678  -1.208   0.2271  
stenose50-70%              1.345003   1.366009   0.985   0.3248  
stenose70-90%              1.474735   1.278492   1.153   0.2487  
stenose90-99%              1.183503   1.274224   0.929   0.3530  
stenose100% (Occlusion)    1.433390   1.603296   0.894   0.3713  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 698.10  on 513  degrees of freedom
Residual deviance: 676.62  on 496  degrees of freedom
AIC: 712.62

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.143925 
Standard error............: 0.094902 
Odds ratio (effect size)..: 0.866 
Lower 95% CI..............: 0.719 
Upper 95% CI..............: 1.043 
Z-value...................: -1.516566 
P-value...................: 0.1293764 
Hosmer and Lemeshow r^2...: 0.030769 
Cox and Snell r^2.........: 0.040928 
Nagelkerke's pseudo r^2...: 0.055094 
Sample size of AE DB......: 2388 
Sample size of model......: 514 
Missing data %............: 78.47571 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    SmokerCurrent + Med.all.antiplatelet + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]         SmokerCurrentyes  Med.all.antiplateletyes        Peripheral.interv  
                15.0605                  -0.6325                   0.5715                   0.8102                  -0.5723  
          stenose50-70%            stenose70-90%            stenose90-99%  stenose100% (Occlusion)  
               -13.0595                 -14.0415                 -14.5745                 -14.0760  

Degrees of Freedom: 511 Total (i.e. Null);  503 Residual
Null Deviance:      505.7 
Residual Deviance: 459.5    AIC: 477.5

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5465   0.3165   0.5104   0.6799   1.4542  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                15.999553 778.354658   0.021   0.9836    
currentDF[, PROTEIN]       -0.622928   0.128740  -4.839 1.31e-06 ***
Age                        -0.005270   0.015877  -0.332   0.7399    
Gendermale                 -0.109271   0.281106  -0.389   0.6975    
Hypertension.compositeyes   0.232635   0.346594   0.671   0.5021    
DiabetesStatusDiabetes      0.322371   0.320516   1.006   0.3145    
SmokerCurrentyes            0.569775   0.272057   2.094   0.0362 *  
Med.Statin.LLDyes           0.069345   0.268917   0.258   0.7965    
Med.all.antiplateletyes     0.802899   0.388040   2.069   0.0385 *  
GFR_MDRD                   -0.002382   0.006955  -0.343   0.7320    
BMI                        -0.025431   0.033840  -0.752   0.4523    
CAD_history                 0.128771   0.267709   0.481   0.6305    
Stroke_history              0.133460   0.258321   0.517   0.6054    
Peripheral.interv          -0.629923   0.299489  -2.103   0.0354 *  
stenose50-70%             -13.094548 778.353270  -0.017   0.9866    
stenose70-90%             -14.077384 778.352577  -0.018   0.9856    
stenose90-99%             -14.620319 778.352564  -0.019   0.9850    
stenose100% (Occlusion)   -14.008097 778.353486  -0.018   0.9856    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 505.69  on 511  degrees of freedom
Residual deviance: 456.43  on 494  degrees of freedom
AIC: 492.43

Number of Fisher Scoring iterations: 14

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.622928 
Standard error............: 0.12874 
Odds ratio (effect size)..: 0.536 
Lower 95% CI..............: 0.417 
Upper 95% CI..............: 0.69 
Z-value...................: -4.83865 
P-value...................: 1.307237e-06 
Hosmer and Lemeshow r^2...: 0.097413 
Cox and Snell r^2.........: 0.091729 
Nagelkerke's pseudo r^2...: 0.146168 
Sample size of AE DB......: 2388 
Sample size of model......: 512 
Missing data %............: 78.55946 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + Hypertension.composite + Stroke_history, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
              (Intercept)       currentDF[, PROTEIN]                 Gendermale  Hypertension.compositeyes             Stroke_history  
                   0.4409                     0.6533                     0.5583                     0.6017                     0.6751  

Degrees of Freedom: 513 Total (i.e. Null);  509 Residual
Null Deviance:      506.6 
Residual Deviance: 459.5    AIC: 469.5

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5740   0.2922   0.4930   0.6720   1.5683  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                12.661734 817.641489   0.015   0.9876    
currentDF[, PROTEIN]        0.656649   0.132397   4.960 7.06e-07 ***
Age                         0.001732   0.015546   0.111   0.9113    
Gendermale                  0.612693   0.256582   2.388   0.0169 *  
Hypertension.compositeyes   0.685985   0.341187   2.011   0.0444 *  
DiabetesStatusDiabetes     -0.262261   0.294365  -0.891   0.3730    
SmokerCurrentyes            0.363236   0.268874   1.351   0.1767    
Med.Statin.LLDyes          -0.147175   0.293177  -0.502   0.6157    
Med.all.antiplateletyes     0.038168   0.411206   0.093   0.9260    
GFR_MDRD                   -0.001070   0.007032  -0.152   0.8790    
BMI                         0.041989   0.032506   1.292   0.1965    
CAD_history                -0.184485   0.275017  -0.671   0.5023    
Stroke_history              0.635540   0.279528   2.274   0.0230 *  
Peripheral.interv          -0.174872   0.301205  -0.581   0.5615    
stenose50-70%             -14.255551 817.639783  -0.017   0.9861    
stenose70-90%             -13.148729 817.639613  -0.016   0.9872    
stenose90-99%             -13.458669 817.639598  -0.016   0.9869    
stenose100% (Occlusion)   -13.167887 817.640433  -0.016   0.9872    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 506.55  on 513  degrees of freedom
Residual deviance: 448.02  on 496  degrees of freedom
AIC: 484.02

Number of Fisher Scoring iterations: 14

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.656649 
Standard error............: 0.132397 
Odds ratio (effect size)..: 1.928 
Lower 95% CI..............: 1.488 
Upper 95% CI..............: 2.5 
Z-value...................: 4.959683 
P-value...................: 7.060839e-07 
Hosmer and Lemeshow r^2...: 0.115562 
Cox and Snell r^2.........: 0.107642 
Nagelkerke's pseudo r^2...: 0.171745 
Sample size of AE DB......: 2388 
Sample size of model......: 514 
Missing data %............: 78.47571 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender + 
    DiabetesStatus + BMI + Peripheral.interv, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
           (Intercept)                     Age              Gendermale  DiabetesStatusDiabetes                     BMI  
              -2.41015                 0.02549                 0.72976                -0.55880                 0.05326  
     Peripheral.interv  
               0.46653  

Degrees of Freedom: 513 Total (i.e. Null);  508 Residual
Null Deviance:      568 
Residual Deviance: 544  AIC: 556

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1812   0.4279   0.6129   0.7610   1.5453  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)   
(Intercept)               -3.337489   2.007482  -1.663  0.09641 . 
currentDF[, PROTEIN]       0.114993   0.110404   1.042  0.29761   
Age                        0.021692   0.013848   1.566  0.11724   
Gendermale                 0.699221   0.231008   3.027  0.00247 **
Hypertension.compositeyes  0.332762   0.307165   1.083  0.27866   
DiabetesStatusDiabetes    -0.570391   0.259801  -2.195  0.02813 * 
SmokerCurrentyes           0.111871   0.236363   0.473  0.63600   
Med.Statin.LLDyes         -0.055247   0.255070  -0.217  0.82852   
Med.all.antiplateletyes   -0.189324   0.397135  -0.477  0.63356   
GFR_MDRD                  -0.003295   0.006174  -0.534  0.59352   
BMI                        0.051262   0.029169   1.757  0.07884 . 
CAD_history                0.218815   0.255681   0.856  0.39210   
Stroke_history             0.130905   0.232489   0.563  0.57339   
Peripheral.interv          0.448115   0.306829   1.460  0.14416   
stenose50-70%              1.269161   1.380367   0.919  0.35787   
stenose70-90%              1.185950   1.267384   0.936  0.34940   
stenose90-99%              1.355527   1.264520   1.072  0.28373   
stenose100% (Occlusion)    1.465751   1.720671   0.852  0.39430   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 567.98  on 513  degrees of freedom
Residual deviance: 538.07  on 496  degrees of freedom
AIC: 574.07

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.114993 
Standard error............: 0.110404 
Odds ratio (effect size)..: 1.122 
Lower 95% CI..............: 0.904 
Upper 95% CI..............: 1.393 
Z-value...................: 1.041567 
P-value...................: 0.2976126 
Hosmer and Lemeshow r^2...: 0.052662 
Cox and Snell r^2.........: 0.056532 
Nagelkerke's pseudo r^2...: 0.084528 
Sample size of AE DB......: 2388 
Sample size of model......: 514 
Missing data %............: 78.47571 

Analysis of IL6_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + SmokerCurrent + CAD_history + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]                      Age         SmokerCurrentyes              CAD_history  
               -1.21906                 -0.10139                  0.01999                  0.39841                  0.25581  
          stenose50-70%            stenose70-90%            stenose90-99%  stenose100% (Occlusion)            stenose50-99%  
               -1.00567                 -0.50697                 -0.26246                  0.80569                -13.93538  
          stenose70-99%  
               -1.53003  

Degrees of Freedom: 996 Total (i.e. Null);  986 Residual
Null Deviance:      1381 
Residual Deviance: 1349     AIC: 1371

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6147  -1.1333  -0.7964   1.1564   1.6722  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)   
(Intercept)                -0.909944   1.321284  -0.689  0.49102   
currentDF[, PROTEIN]       -0.099976   0.066163  -1.511  0.13077   
Age                         0.017028   0.008100   2.102  0.03552 * 
Gendermale                 -0.132850   0.144146  -0.922  0.35672   
Hypertension.compositeyes   0.232383   0.202519   1.147  0.25119   
DiabetesStatusDiabetes     -0.175024   0.159524  -1.097  0.27257   
SmokerCurrentyes            0.413549   0.146703   2.819  0.00482 **
Med.Statin.LLDyes          -0.164639   0.159153  -1.034  0.30092   
Med.all.antiplateletyes    -0.223519   0.217193  -1.029  0.30342   
GFR_MDRD                   -0.001873   0.003492  -0.536  0.59169   
BMI                         0.012482   0.018095   0.690  0.49034   
CAD_history                 0.264314   0.149945   1.763  0.07795 . 
Stroke_history             -0.138429   0.140758  -0.983  0.32538   
Peripheral.interv          -0.183619   0.172919  -1.062  0.28829   
stenose50-70%              -0.939975   0.962505  -0.977  0.32877   
stenose70-90%              -0.485844   0.928836  -0.523  0.60093   
stenose90-99%              -0.236697   0.928355  -0.255  0.79875   
stenose100% (Occlusion)     0.801826   1.244197   0.644  0.51928   
stenose50-99%             -14.007873 368.424975  -0.038  0.96967   
stenose70-99%              -1.453878   1.253623  -1.160  0.24615   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1381.3  on 996  degrees of freedom
Residual deviance: 1340.3  on 977  degrees of freedom
AIC: 1380.3

Number of Fisher Scoring iterations: 12

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.099976 
Standard error............: 0.066163 
Odds ratio (effect size)..: 0.905 
Lower 95% CI..............: 0.795 
Upper 95% CI..............: 1.03 
Z-value...................: -1.511065 
P-value...................: 0.1307718 
Hosmer and Lemeshow r^2...: 0.029706 
Cox and Snell r^2.........: 0.04032 
Nagelkerke's pseudo r^2...: 0.053776 
Sample size of AE DB......: 2388 
Sample size of model......: 997 
Missing data %............: 58.24958 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Hypertension.composite + SmokerCurrent + BMI + Stroke_history, 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
              (Intercept)       currentDF[, PROTEIN]  Hypertension.compositeyes           SmokerCurrentyes                        BMI  
                 -0.01981                   -0.29027                    0.34009                    0.44475                    0.03349  
           Stroke_history  
                  0.25226  

Degrees of Freedom: 999 Total (i.e. Null);  994 Residual
Null Deviance:      1017 
Residual Deviance: 993  AIC: 1005

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2838   0.4520   0.6083   0.7205   1.0945  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.292e+01  6.481e+02   0.020 0.984089    
currentDF[, PROTEIN]      -2.788e-01  8.257e-02  -3.376 0.000735 ***
Age                        8.333e-03  9.876e-03   0.844 0.398752    
Gendermale                -8.397e-02  1.781e-01  -0.471 0.637300    
Hypertension.compositeyes  3.107e-01  2.330e-01   1.334 0.182365    
DiabetesStatusDiabetes     2.105e-01  2.039e-01   1.033 0.301764    
SmokerCurrentyes           4.917e-01  1.863e-01   2.639 0.008305 ** 
Med.Statin.LLDyes         -1.661e-02  1.955e-01  -0.085 0.932280    
Med.all.antiplateletyes    1.316e-01  2.617e-01   0.503 0.615014    
GFR_MDRD                   4.714e-03  4.302e-03   1.096 0.273176    
BMI                        3.356e-02  2.363e-02   1.420 0.155532    
CAD_history                2.203e-01  1.882e-01   1.171 0.241679    
Stroke_history             2.405e-01  1.765e-01   1.363 0.172966    
Peripheral.interv         -1.820e-02  2.155e-01  -0.084 0.932671    
stenose50-70%             -1.361e+01  6.481e+02  -0.021 0.983249    
stenose70-90%             -1.401e+01  6.481e+02  -0.022 0.982747    
stenose90-99%             -1.406e+01  6.481e+02  -0.022 0.982690    
stenose100% (Occlusion)    4.945e-01  8.183e+02   0.001 0.999518    
stenose50-99%              1.313e-02  1.208e+03   0.000 0.999991    
stenose70-99%             -1.373e+01  6.481e+02  -0.021 0.983103    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1017.22  on 999  degrees of freedom
Residual deviance:  980.18  on 980  degrees of freedom
AIC: 1020.2

Number of Fisher Scoring iterations: 14

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.278762 
Standard error............: 0.08257 
Odds ratio (effect size)..: 0.757 
Lower 95% CI..............: 0.644 
Upper 95% CI..............: 0.89 
Z-value...................: -3.376059 
P-value...................: 0.0007353204 
Hosmer and Lemeshow r^2...: 0.036411 
Cox and Snell r^2.........: 0.036361 
Nagelkerke's pseudo r^2...: 0.056956 
Sample size of AE DB......: 2388 
Sample size of model......: 1000 
Missing data %............: 58.12395 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + Stroke_history + Peripheral.interv, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale        Stroke_history     Peripheral.interv  
              0.5014                0.4505                0.8327                0.3722               -0.6087  

Degrees of Freedom: 999 Total (i.e. Null);  995 Residual
Null Deviance:      1165 
Residual Deviance: 1079     AIC: 1089

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2290  -1.0455   0.6047   0.8064   2.0491  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.317e+01  3.905e+02   0.034 0.973093    
currentDF[, PROTEIN]       4.532e-01  7.890e-02   5.744 9.26e-09 ***
Age                        9.621e-03  9.328e-03   1.031 0.302330    
Gendermale                 8.512e-01  1.611e-01   5.282 1.27e-07 ***
Hypertension.compositeyes  6.829e-02  2.349e-01   0.291 0.771250    
DiabetesStatusDiabetes    -1.155e-01  1.839e-01  -0.628 0.529991    
SmokerCurrentyes           1.014e-01  1.710e-01   0.593 0.553366    
Med.Statin.LLDyes         -1.768e-01  1.904e-01  -0.928 0.353200    
Med.all.antiplateletyes    6.371e-02  2.501e-01   0.255 0.798916    
GFR_MDRD                  -2.636e-04  4.098e-03  -0.064 0.948718    
BMI                        3.776e-03  2.044e-02   0.185 0.853460    
CAD_history                7.889e-02  1.751e-01   0.451 0.652297    
Stroke_history             3.768e-01  1.703e-01   2.213 0.026912 *  
Peripheral.interv         -6.136e-01  1.860e-01  -3.299 0.000972 ***
stenose50-70%             -1.353e+01  3.905e+02  -0.035 0.972366    
stenose70-90%             -1.348e+01  3.905e+02  -0.035 0.972456    
stenose90-99%             -1.333e+01  3.905e+02  -0.034 0.972772    
stenose100% (Occlusion)   -1.427e+01  3.905e+02  -0.037 0.970836    
stenose50-99%             -1.498e+01  3.905e+02  -0.038 0.969387    
stenose70-99%             -1.461e+01  3.905e+02  -0.037 0.970150    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1164.5  on 999  degrees of freedom
Residual deviance: 1067.6  on 980  degrees of freedom
AIC: 1107.6

Number of Fisher Scoring iterations: 13

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.453209 
Standard error............: 0.078905 
Odds ratio (effect size)..: 1.573 
Lower 95% CI..............: 1.348 
Upper 95% CI..............: 1.837 
Z-value...................: 5.743761 
P-value...................: 9.259659e-09 
Hosmer and Lemeshow r^2...: 0.083261 
Cox and Snell r^2.........: 0.092407 
Nagelkerke's pseudo r^2...: 0.134327 
Sample size of AE DB......: 2388 
Sample size of model......: 1000 
Missing data %............: 58.12395 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Gender + Med.Statin.LLD + 
    BMI + CAD_history + Stroke_history + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)               Gendermale        Med.Statin.LLDyes                      BMI              CAD_history  
                0.16028                  0.59271                 -0.25963                  0.02923                  0.30318  
         Stroke_history            stenose50-70%            stenose70-90%            stenose90-99%  stenose100% (Occlusion)  
                0.25028                 -1.09743                 -0.97086                 -0.65159                 -0.80087  
          stenose50-99%            stenose70-99%  
              -15.27559                  0.59126  

Degrees of Freedom: 998 Total (i.e. Null);  987 Residual
Null Deviance:      1331 
Residual Deviance: 1288     AIC: 1312

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9367  -1.2695   0.8101   0.9793   1.4492  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                 0.134237   1.491544   0.090   0.9283    
currentDF[, PROTEIN]        0.054522   0.068254   0.799   0.4244    
Age                         0.001619   0.008307   0.195   0.8455    
Gendermale                  0.638876   0.146508   4.361  1.3e-05 ***
Hypertension.compositeyes  -0.108080   0.207201  -0.522   0.6019    
DiabetesStatusDiabetes     -0.123290   0.163538  -0.754   0.4509    
SmokerCurrentyes            0.124934   0.151554   0.824   0.4097    
Med.Statin.LLDyes          -0.249499   0.167274  -1.492   0.1358    
Med.all.antiplateletyes     0.161931   0.221057   0.733   0.4638    
GFR_MDRD                   -0.004974   0.003614  -1.376   0.1687    
BMI                         0.033028   0.018696   1.767   0.0773 .  
CAD_history                 0.310960   0.157200   1.978   0.0479 *  
Stroke_history              0.230621   0.146500   1.574   0.1154    
Peripheral.interv           0.037076   0.178283   0.208   0.8353    
stenose50-70%              -1.011322   1.165248  -0.868   0.3854    
stenose70-90%              -0.904406   1.139736  -0.794   0.4275    
stenose90-99%              -0.590355   1.139754  -0.518   0.6045    
stenose100% (Occlusion)    -0.735447   1.357428  -0.542   0.5880    
stenose50-99%             -15.239630 376.951258  -0.040   0.9678    
stenose70-99%               0.597045   1.580966   0.378   0.7057    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1331.0  on 998  degrees of freedom
Residual deviance: 1283.4  on 979  degrees of freedom
AIC: 1323.4

Number of Fisher Scoring iterations: 12

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.054522 
Standard error............: 0.068254 
Odds ratio (effect size)..: 1.056 
Lower 95% CI..............: 0.924 
Upper 95% CI..............: 1.207 
Z-value...................: 0.798812 
P-value...................: 0.4243993 
Hosmer and Lemeshow r^2...: 0.03579 
Cox and Snell r^2.........: 0.046565 
Nagelkerke's pseudo r^2...: 0.063256 
Sample size of AE DB......: 2388 
Sample size of model......: 999 
Missing data %............: 58.16583 

Analysis of IL6R_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Hypertension.composite + 
    DiabetesStatus + SmokerCurrent + CAD_history + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
              (Intercept)                        Age  Hypertension.compositeyes     DiabetesStatusDiabetes           SmokerCurrentyes  
                 -0.47387                    0.01628                    0.29007                   -0.24352                    0.33077  
              CAD_history              stenose50-70%              stenose70-90%              stenose90-99%    stenose100% (Occlusion)  
                  0.22888                   -1.57353                   -1.17165                   -0.93734                    0.08563  
            stenose50-99%              stenose70-99%  
                -15.69452                   -2.08325  

Degrees of Freedom: 1000 Total (i.e. Null);  989 Residual
Null Deviance:      1387 
Residual Deviance: 1354     AIC: 1378

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.5705  -1.1316  -0.8359   1.1617   1.7412  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)  
(Intercept)                 0.212109   1.495726   0.142   0.8872  
currentDF[, PROTEIN]       -0.002449   0.066213  -0.037   0.9705  
Age                         0.013336   0.008150   1.636   0.1018  
Gendermale                 -0.162994   0.143965  -1.132   0.2576  
Hypertension.compositeyes   0.294333   0.200281   1.470   0.1417  
DiabetesStatusDiabetes     -0.249693   0.159825  -1.562   0.1182  
SmokerCurrentyes            0.336013   0.145847   2.304   0.0212 *
Med.Statin.LLDyes          -0.108235   0.161265  -0.671   0.5021  
Med.all.antiplateletyes    -0.255972   0.219348  -1.167   0.2432  
GFR_MDRD                   -0.002395   0.003551  -0.674   0.5000  
BMI                         0.004821   0.018465   0.261   0.7940  
CAD_history                 0.251978   0.149114   1.690   0.0911 .
Stroke_history             -0.166730   0.139636  -1.194   0.2325  
Peripheral.interv          -0.196876   0.172959  -1.138   0.2550  
stenose50-70%              -1.465448   1.195541  -1.226   0.2203  
stenose70-90%              -1.113704   1.168398  -0.953   0.3405  
stenose90-99%              -0.867558   1.168634  -0.742   0.4579  
stenose100% (Occlusion)     0.118872   1.429842   0.083   0.9337  
stenose50-99%             -15.589875 435.856093  -0.036   0.9715  
stenose70-99%              -1.997577   1.438041  -1.389   0.1648  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1386.7  on 1000  degrees of freedom
Residual deviance: 1347.6  on  981  degrees of freedom
AIC: 1387.6

Number of Fisher Scoring iterations: 13

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.002449 
Standard error............: 0.066213 
Odds ratio (effect size)..: 0.998 
Lower 95% CI..............: 0.876 
Upper 95% CI..............: 1.136 
Z-value...................: -0.036981 
P-value...................: 0.9704999 
Hosmer and Lemeshow r^2...: 0.028198 
Cox and Snell r^2.........: 0.03831 
Nagelkerke's pseudo r^2...: 0.051096 
Sample size of AE DB......: 2388 
Sample size of model......: 1001 
Missing data %............: 58.08208 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ SmokerCurrent + 
    CAD_history, family = binomial(link = "logit"), data = currentDF)

Coefficients:
     (Intercept)  SmokerCurrentyes       CAD_history  
          1.1251            0.4158            0.3017  

Degrees of Freedom: 1003 Total (i.e. Null);  1001 Residual
Null Deviance:      1022 
Residual Deviance: 1014     AIC: 1020

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1265   0.4975   0.6343   0.7205   0.9708  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)   
(Intercept)                1.282e+01  7.188e+02   0.018  0.98577   
currentDF[, PROTEIN]       8.155e-03  8.142e-02   0.100  0.92022   
Age                        1.014e-02  9.909e-03   1.023  0.30614   
Gendermale                 4.618e-02  1.747e-01   0.264  0.79159   
Hypertension.compositeyes  2.825e-01  2.303e-01   1.227  0.21991   
DiabetesStatusDiabetes     2.034e-01  2.026e-01   1.004  0.31533   
SmokerCurrentyes           4.830e-01  1.850e-01   2.610  0.00905 **
Med.Statin.LLDyes          3.976e-02  1.953e-01   0.204  0.83865   
Med.all.antiplateletyes    2.293e-01  2.583e-01   0.888  0.37472   
GFR_MDRD                   4.130e-03  4.355e-03   0.948  0.34288   
BMI                        2.798e-02  2.331e-02   1.200  0.23000   
CAD_history                2.663e-01  1.871e-01   1.423  0.15476   
Stroke_history             2.061e-01  1.740e-01   1.184  0.23622   
Peripheral.interv          7.680e-02  2.159e-01   0.356  0.72202   
stenose50-70%             -1.365e+01  7.188e+02  -0.019  0.98485   
stenose70-90%             -1.411e+01  7.188e+02  -0.020  0.98434   
stenose90-99%             -1.411e+01  7.188e+02  -0.020  0.98434   
stenose100% (Occlusion)    3.208e-01  8.796e+02   0.000  0.99971   
stenose50-99%             -1.451e-01  1.020e+03   0.000  0.99989   
stenose70-99%             -1.370e+01  7.188e+02  -0.019  0.98479   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1021.76  on 1003  degrees of freedom
Residual deviance:  996.48  on  984  degrees of freedom
AIC: 1036.5

Number of Fisher Scoring iterations: 14

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: 0.008155 
Standard error............: 0.081415 
Odds ratio (effect size)..: 1.008 
Lower 95% CI..............: 0.859 
Upper 95% CI..............: 1.183 
Z-value...................: 0.100161 
P-value...................: 0.9202161 
Hosmer and Lemeshow r^2...: 0.024745 
Cox and Snell r^2.........: 0.024868 
Nagelkerke's pseudo r^2...: 0.038943 
Sample size of AE DB......: 2388 
Sample size of model......: 1004 
Missing data %............: 57.95645 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + Stroke_history + Peripheral.interv, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale        Stroke_history     Peripheral.interv  
              0.4550                0.1229                0.7952                0.4442               -0.6211  

Degrees of Freedom: 1003 Total (i.e. Null);  999 Residual
Null Deviance:      1171 
Residual Deviance: 1122     AIC: 1132

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0862  -1.1264   0.6590   0.7969   1.8542  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.332e+01  4.411e+02   0.030  0.97591    
currentDF[, PROTEIN]       9.800e-02  7.527e-02   1.302  0.19292    
Age                        1.132e-02  9.265e-03   1.222  0.22178    
Gendermale                 8.405e-01  1.583e-01   5.308 1.11e-07 ***
Hypertension.compositeyes -1.069e-03  2.299e-01  -0.005  0.99629    
DiabetesStatusDiabetes    -1.151e-01  1.801e-01  -0.639  0.52259    
SmokerCurrentyes           1.497e-01  1.676e-01   0.894  0.37152    
Med.Statin.LLDyes         -1.464e-01  1.904e-01  -0.769  0.44205    
Med.all.antiplateletyes    4.523e-02  2.493e-01   0.181  0.85603    
GFR_MDRD                   5.281e-06  4.114e-03   0.001  0.99898    
BMI                       -5.235e-03  2.075e-02  -0.252  0.80084    
CAD_history               -6.362e-02  1.695e-01  -0.375  0.70743    
Stroke_history             4.412e-01  1.660e-01   2.658  0.00787 ** 
Peripheral.interv         -5.960e-01  1.843e-01  -3.234  0.00122 ** 
stenose50-70%             -1.358e+01  4.411e+02  -0.031  0.97545    
stenose70-90%             -1.349e+01  4.411e+02  -0.031  0.97560    
stenose90-99%             -1.338e+01  4.411e+02  -0.030  0.97581    
stenose100% (Occlusion)   -1.416e+01  4.411e+02  -0.032  0.97440    
stenose50-99%             -1.586e+01  4.411e+02  -0.036  0.97132    
stenose70-99%             -1.470e+01  4.411e+02  -0.033  0.97341    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1171.0  on 1003  degrees of freedom
Residual deviance: 1106.8  on  984  degrees of freedom
AIC: 1146.8

Number of Fisher Scoring iterations: 13

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.097997 
Standard error............: 0.075268 
Odds ratio (effect size)..: 1.103 
Lower 95% CI..............: 0.952 
Upper 95% CI..............: 1.278 
Z-value...................: 1.301985 
P-value...................: 0.1929215 
Hosmer and Lemeshow r^2...: 0.054819 
Cox and Snell r^2.........: 0.061938 
Nagelkerke's pseudo r^2...: 0.08996 
Sample size of AE DB......: 2388 
Sample size of model......: 1004 
Missing data %............: 57.95645 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + GFR_MDRD + CAD_history, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale              GFR_MDRD           CAD_history  
            0.347137              0.149195              0.581414             -0.004984              0.228735  

Degrees of Freedom: 1001 Total (i.e. Null);  997 Residual
Null Deviance:      1338 
Residual Deviance: 1311     AIC: 1321

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9319  -1.2821   0.8263   0.9878   1.4773  

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)                0.693593   1.522867   0.455   0.6488    
currentDF[, PROTEIN]       0.136420   0.068451   1.993   0.0463 *  
Age                       -0.001134   0.008382  -0.135   0.8924    
Gendermale                 0.611644   0.146076   4.187 2.82e-05 ***
Hypertension.compositeyes -0.110197   0.204287  -0.539   0.5896    
DiabetesStatusDiabetes    -0.154479   0.162386  -0.951   0.3414    
SmokerCurrentyes           0.113081   0.150460   0.752   0.4523    
Med.Statin.LLDyes         -0.148415   0.167690  -0.885   0.3761    
Med.all.antiplateletyes    0.060511   0.223809   0.270   0.7869    
GFR_MDRD                  -0.005323   0.003674  -1.449   0.1474    
BMI                        0.017774   0.018965   0.937   0.3486    
CAD_history                0.289601   0.155217   1.866   0.0621 .  
Stroke_history             0.153900   0.144197   1.067   0.2858    
Peripheral.interv          0.004085   0.178235   0.023   0.9817    
stenose50-70%             -0.739569   1.207855  -0.612   0.5403    
stenose70-90%             -0.772461   1.182418  -0.653   0.5136    
stenose90-99%             -0.519486   1.182942  -0.439   0.6606    
stenose100% (Occlusion)   -0.605786   1.393142  -0.435   0.6637    
stenose50-99%             -1.096639   1.556511  -0.705   0.4811    
stenose70-99%              0.852030   1.607425   0.530   0.5961    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1337.7  on 1001  degrees of freedom
Residual deviance: 1299.2  on  982  degrees of freedom
AIC: 1339.2

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: 0.13642 
Standard error............: 0.068451 
Odds ratio (effect size)..: 1.146 
Lower 95% CI..............: 1.002 
Upper 95% CI..............: 1.311 
Z-value...................: 1.992945 
P-value...................: 0.04626743 
Hosmer and Lemeshow r^2...: 0.028723 
Cox and Snell r^2.........: 0.037619 
Nagelkerke's pseudo r^2...: 0.051055 
Sample size of AE DB......: 2388 
Sample size of model......: 1002 
Missing data %............: 58.0402 

Analysis of MCP1_pg_ug_2015_rank.

- processing CalcificationPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + SmokerCurrent + CAD_history + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]                      Age         SmokerCurrentyes              CAD_history  
               -1.37299                 -0.47406                  0.02058                  0.40394                  0.24014  
          stenose50-70%            stenose70-90%            stenose90-99%  stenose100% (Occlusion)            stenose50-99%  
               -0.88314                 -0.37300                 -0.18504                  0.71187                -14.80113  
          stenose70-99%  
               -1.21694  

Degrees of Freedom: 1038 Total (i.e. Null);  1028 Residual
Null Deviance:      1439 
Residual Deviance: 1354     AIC: 1376

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8920  -1.0857  -0.6854   1.1100   2.0741  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                -1.111475   1.329496  -0.836  0.40315    
currentDF[, PROTEIN]       -0.474349   0.068483  -6.927 4.31e-12 ***
Age                         0.017814   0.008172   2.180  0.02927 *  
Gendermale                 -0.141964   0.144258  -0.984  0.32507    
Hypertension.compositeyes   0.223348   0.202733   1.102  0.27060    
DiabetesStatusDiabetes     -0.239143   0.160905  -1.486  0.13722    
SmokerCurrentyes            0.415158   0.147167   2.821  0.00479 ** 
Med.Statin.LLDyes          -0.180621   0.161314  -1.120  0.26285    
Med.all.antiplateletyes    -0.196875   0.219018  -0.899  0.36871    
GFR_MDRD                   -0.001495   0.003520  -0.425  0.67110    
BMI                         0.012799   0.018157   0.705  0.48087    
CAD_history                 0.263913   0.150066   1.759  0.07864 .  
Stroke_history             -0.113515   0.140974  -0.805  0.42069    
Peripheral.interv          -0.192409   0.172486  -1.116  0.26463    
stenose50-70%              -0.816931   0.965795  -0.846  0.39763    
stenose70-90%              -0.342436   0.930578  -0.368  0.71289    
stenose90-99%              -0.154316   0.930195  -0.166  0.86824    
stenose100% (Occlusion)     0.718982   1.255767   0.573  0.56695    
stenose50-99%             -14.791163 417.958374  -0.035  0.97177    
stenose70-99%              -1.145147   1.267273  -0.904  0.36619    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1439.2  on 1038  degrees of freedom
Residual deviance: 1345.5  on 1019  degrees of freedom
AIC: 1385.5

Number of Fisher Scoring iterations: 13

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' CalcificationPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: CalcificationPlaque 
Effect size...............: -0.474349 
Standard error............: 0.068483 
Odds ratio (effect size)..: 0.622 
Lower 95% CI..............: 0.544 
Upper 95% CI..............: 0.712 
Z-value...................: -6.926517 
P-value...................: 4.313271e-12 
Hosmer and Lemeshow r^2...: 0.065099 
Cox and Snell r^2.........: 0.086227 
Nagelkerke's pseudo r^2...: 0.115013 
Sample size of AE DB......: 2388 
Sample size of model......: 1039 
Missing data %............: 56.49079 

- processing CollagenPlaque


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    SmokerCurrent + BMI, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]      SmokerCurrentyes                   BMI  
             0.20733              -0.23235               0.44405               0.03906  

Degrees of Freedom: 1041 Total (i.e. Null);  1038 Residual
Null Deviance:      1055 
Residual Deviance: 1037     AIC: 1045

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2648   0.4510   0.6178   0.7190   1.0442  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)   
(Intercept)                1.346e+01  1.061e+03   0.013  0.98988   
currentDF[, PROTEIN]      -2.260e-01  7.941e-02  -2.846  0.00443 **
Age                        1.026e-02  9.723e-03   1.055  0.29133   
Gendermale                 2.043e-02  1.727e-01   0.118  0.90585   
Hypertension.compositeyes  2.367e-01  2.301e-01   1.029  0.30368   
DiabetesStatusDiabetes     1.304e-01  1.981e-01   0.658  0.51029   
SmokerCurrentyes           5.189e-01  1.836e-01   2.826  0.00472 **
Med.Statin.LLDyes          1.422e-02  1.924e-01   0.074  0.94111   
Med.all.antiplateletyes    1.565e-01  2.563e-01   0.611  0.54149   
GFR_MDRD                   5.598e-03  4.241e-03   1.320  0.18688   
BMI                        4.070e-02  2.308e-02   1.763  0.07787 . 
CAD_history                2.143e-01  1.838e-01   1.166  0.24353   
Stroke_history             2.224e-01  1.727e-01   1.288  0.19786   
Peripheral.interv          1.098e-01  2.127e-01   0.516  0.60574   
stenose50-70%             -1.453e+01  1.061e+03  -0.014  0.98907   
stenose70-90%             -1.499e+01  1.061e+03  -0.014  0.98873   
stenose90-99%             -1.505e+01  1.061e+03  -0.014  0.98869   
stenose100% (Occlusion)    2.439e-01  1.351e+03   0.000  0.99986   
stenose50-99%             -1.824e-02  1.589e+03   0.000  0.99999   
stenose70-99%             -1.449e+01  1.061e+03  -0.014  0.98911   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1055.5  on 1041  degrees of freedom
Residual deviance: 1019.7  on 1022  degrees of freedom
AIC: 1059.7

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' CollagenPlaque ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: CollagenPlaque 
Effect size...............: -0.225966 
Standard error............: 0.079411 
Odds ratio (effect size)..: 0.798 
Lower 95% CI..............: 0.683 
Upper 95% CI..............: 0.932 
Z-value...................: -2.845529 
P-value...................: 0.00443377 
Hosmer and Lemeshow r^2...: 0.033878 
Cox and Snell r^2.........: 0.033733 
Nagelkerke's pseudo r^2...: 0.052969 
Sample size of AE DB......: 2388 
Sample size of model......: 1042 
Missing data %............: 56.36516 

- processing Fat10Perc


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + Stroke_history + Peripheral.interv + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]               Gendermale           Stroke_history        Peripheral.interv  
                13.9001                   0.1685                   0.8324                   0.4438                  -0.6179  
          stenose50-70%            stenose70-90%            stenose90-99%  stenose100% (Occlusion)            stenose50-99%  
               -13.6499                 -13.5208                 -13.3630                 -14.0674                 -15.9302  
          stenose70-99%  
               -14.7641  

Degrees of Freedom: 1041 Total (i.e. Null);  1031 Residual
Null Deviance:      1225 
Residual Deviance: 1154     AIC: 1176

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1038  -1.1336   0.6504   0.8116   1.7658  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.325e+01  3.926e+02   0.034 0.973076    
currentDF[, PROTEIN]       1.633e-01  7.323e-02   2.230 0.025771 *  
Age                        7.988e-03  8.972e-03   0.890 0.373294    
Gendermale                 8.706e-01  1.541e-01   5.650  1.6e-08 ***
Hypertension.compositeyes  4.406e-02  2.265e-01   0.194 0.845801    
DiabetesStatusDiabetes    -1.615e-01  1.756e-01  -0.920 0.357650    
SmokerCurrentyes           1.448e-01  1.637e-01   0.885 0.376349    
Med.Statin.LLDyes         -1.876e-01  1.861e-01  -1.008 0.313562    
Med.all.antiplateletyes    7.910e-02  2.423e-01   0.327 0.744039    
GFR_MDRD                  -6.075e-04  3.926e-03  -0.155 0.877040    
BMI                        3.774e-03  1.972e-02   0.191 0.848251    
CAD_history               -3.938e-02  1.660e-01  -0.237 0.812467    
Stroke_history             4.320e-01  1.633e-01   2.645 0.008160 ** 
Peripheral.interv         -5.908e-01  1.790e-01  -3.300 0.000965 ***
stenose50-70%             -1.358e+01  3.926e+02  -0.035 0.972398    
stenose70-90%             -1.345e+01  3.926e+02  -0.034 0.972660    
stenose90-99%             -1.331e+01  3.926e+02  -0.034 0.972956    
stenose100% (Occlusion)   -1.405e+01  3.926e+02  -0.036 0.971459    
stenose50-99%             -1.591e+01  3.926e+02  -0.041 0.967674    
stenose70-99%             -1.478e+01  3.926e+02  -0.038 0.969972    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1224.7  on 1041  degrees of freedom
Residual deviance: 1150.4  on 1022  degrees of freedom
AIC: 1190.4

Number of Fisher Scoring iterations: 13

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' Fat10Perc ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: Fat10Perc 
Effect size...............: 0.163285 
Standard error............: 0.073234 
Odds ratio (effect size)..: 1.177 
Lower 95% CI..............: 1.02 
Upper 95% CI..............: 1.359 
Z-value...................: 2.22964 
P-value...................: 0.02577136 
Hosmer and Lemeshow r^2...: 0.060666 
Cox and Snell r^2.........: 0.068819 
Nagelkerke's pseudo r^2...: 0.099553 
Sample size of AE DB......: 2388 
Sample size of model......: 1042 
Missing data %............: 56.36516 

- processing IPH


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Gender + Med.Statin.LLD + BMI + CAD_history + Stroke_history, 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]            Gendermale     Med.Statin.LLDyes                   BMI           CAD_history  
            -0.57216              -0.13871               0.54948              -0.27048               0.02716               0.26512  
      Stroke_history  
             0.24072  

Degrees of Freedom: 1039 Total (i.e. Null);  1033 Residual
Null Deviance:      1389 
Residual Deviance: 1357     AIC: 1371

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9631  -1.2808   0.8129   0.9902   1.5437  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                0.2859982  1.4840343   0.193   0.8472    
currentDF[, PROTEIN]      -0.1379693  0.0658565  -2.095   0.0362 *  
Age                        0.0001424  0.0081461   0.017   0.9860    
Gendermale                 0.6169887  0.1429940   4.315  1.6e-05 ***
Hypertension.compositeyes -0.1347125  0.2023482  -0.666   0.5056    
DiabetesStatusDiabetes    -0.1318405  0.1596422  -0.826   0.4089    
SmokerCurrentyes           0.1353045  0.1476443   0.916   0.3594    
Med.Statin.LLDyes         -0.2582250  0.1645153  -1.570   0.1165    
Med.all.antiplateletyes    0.1499145  0.2180924   0.687   0.4918    
GFR_MDRD                  -0.0048941  0.0035333  -1.385   0.1660    
BMI                        0.0318061  0.0183315   1.735   0.0827 .  
CAD_history                0.2693138  0.1520944   1.771   0.0766 .  
Stroke_history             0.2396462  0.1427314   1.679   0.0932 .  
Peripheral.interv          0.0531500  0.1737461   0.306   0.7597    
stenose50-70%             -0.9815249  1.1707234  -0.838   0.4018    
stenose70-90%             -0.8530624  1.1451377  -0.745   0.4563    
stenose90-99%             -0.5996543  1.1451261  -0.524   0.6005    
stenose100% (Occlusion)   -0.7495926  1.3619788  -0.550   0.5821    
stenose50-99%             -1.2353440  1.5277375  -0.809   0.4187    
stenose70-99%              0.6521140  1.5833657   0.412   0.6804    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1388.6  on 1039  degrees of freedom
Residual deviance: 1344.4  on 1020  degrees of freedom
AIC: 1384.4

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' IPH ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: IPH 
Effect size...............: -0.137969 
Standard error............: 0.065856 
Odds ratio (effect size)..: 0.871 
Lower 95% CI..............: 0.766 
Upper 95% CI..............: 0.991 
Z-value...................: -2.095 
P-value...................: 0.03617101 
Hosmer and Lemeshow r^2...: 0.031873 
Cox and Snell r^2.........: 0.041665 
Nagelkerke's pseudo r^2...: 0.056541 
Sample size of AE DB......: 2388 
Sample size of model......: 1040 
Missing data %............: 56.44891 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "Z-value", "P-value", "r^2_l", "r^2_cs", "r^2_nagelkerke", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`Z-value` <- as.numeric(GLM.results$`Z-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2_l` <- as.numeric(GLM.results$`r^2_l`)
GLM.results$`r^2_cs` <- as.numeric(GLM.results$`r^2_cs`)
GLM.results$`r^2_nagelkerke` <- as.numeric(GLM.results$`r^2_nagelkerke`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Bin.Multi.Protein.PlaquePhenotypes.RANK.MODEL2.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Bin.Multi.PlaquePheno")

# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

B. Cross-sectional analysis symptoms

We will perform a cross-sectional analysis between plaque and plasma MCP1, IL6, and IL6R levels and the ‘clinical status’ of the plaque in terms of presence of patients’ symptoms (symptomatic vs. asymptomatic). The symptoms of interest are:

  • stroke
  • TIA
  • retinal infarction
  • amaurosis fugax
  • asymptomatic

Model 1

In this model we correct for Age, Gender, and year of surgery.


GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "AsymptSympt"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate
     # + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
     #            Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
     #            CAD_history + Stroke_history + Peripheral.interv + stenose
    fit <- glm(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender, 
              data  =  currentDF, family = binomial(link = "logit"))
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 16, nrow = 0))
    GLM.results.TEMP[1,] = GLM.BIN(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }

Analysis of IL6_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age  
    0.03354      0.02322  

Degrees of Freedom: 527 Total (i.e. Null);  526 Residual
Null Deviance:      482.2 
Residual Deviance: 479  AIC: 483

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0886   0.5322   0.5876   0.6383   0.8258  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)  
(Intercept)           0.07050    0.88346   0.080   0.9364  
currentDF[, PROTEIN] -0.04480    0.12075  -0.371   0.7106  
Age                   0.02320    0.01296   1.789   0.0735 .
Gendermale           -0.04751    0.25974  -0.183   0.8549  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 482.18  on 527  degrees of freedom
Residual deviance: 478.81  on 524  degrees of freedom
AIC: 486.81

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: -0.044803 
Standard error............: 0.120747 
Odds ratio (effect size)..: 0.956 
Lower 95% CI..............: 0.755 
Upper 95% CI..............: 1.212 
Z-value...................: -0.37105 
P-value...................: 0.7106006 
Hosmer and Lemeshow r^2...: 0.006985 
Cox and Snell r^2.........: 0.006359 
Nagelkerke's pseudo r^2...: 0.010619 
Sample size of AE DB......: 2388 
Sample size of model......: 528 
Missing data %............: 77.88945 

Analysis of MCP1_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age  
             0.28675               0.37178               0.02121  

Degrees of Freedom: 564 Total (i.e. Null);  562 Residual
Null Deviance:      495.5 
Residual Deviance: 483.5    AIC: 489.5

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3596   0.4499   0.5370   0.6291   0.9789  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)   
(Intercept)           0.44218    0.89858   0.492  0.62265   
currentDF[, PROTEIN]  0.38662    0.12065   3.205  0.00135 **
Age                   0.02149    0.01316   1.633  0.10250   
Gendermale           -0.23867    0.26432  -0.903  0.36656   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 495.50  on 564  degrees of freedom
Residual deviance: 482.64  on 561  degrees of freedom
AIC: 490.64

Number of Fisher Scoring iterations: 4

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.386619 
Standard error............: 0.120648 
Odds ratio (effect size)..: 1.472 
Lower 95% CI..............: 1.162 
Upper 95% CI..............: 1.865 
Z-value...................: 3.204514 
P-value...................: 0.001352907 
Hosmer and Lemeshow r^2...: 0.02596 
Cox and Snell r^2.........: 0.022509 
Nagelkerke's pseudo r^2...: 0.038546 
Sample size of AE DB......: 2388 
Sample size of model......: 565 
Missing data %............: 76.34003 

Analysis of IL6_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
             0.34611               0.15893               0.03016              -0.37900  

Degrees of Freedom: 1149 Total (i.e. Null);  1146 Residual
Null Deviance:      790.7 
Residual Deviance: 777  AIC: 785

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4207   0.3921   0.4517   0.5173   0.7538  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)   
(Intercept)           0.34611    0.70495   0.491  0.62345   
currentDF[, PROTEIN]  0.15893    0.09515   1.670  0.09485 . 
Age                   0.03016    0.01029   2.930  0.00339 **
Gendermale           -0.37900    0.22151  -1.711  0.08709 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 790.69  on 1149  degrees of freedom
Residual deviance: 776.96  on 1146  degrees of freedom
AIC: 784.96

Number of Fisher Scoring iterations: 5

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.158935 
Standard error............: 0.095151 
Odds ratio (effect size)..: 1.172 
Lower 95% CI..............: 0.973 
Upper 95% CI..............: 1.413 
Z-value...................: 1.670352 
P-value...................: 0.09484966 
Hosmer and Lemeshow r^2...: 0.017371 
Cox and Snell r^2.........: 0.011873 
Nagelkerke's pseudo r^2...: 0.023879 
Sample size of AE DB......: 2388 
Sample size of model......: 1150 
Missing data %............: 51.84255 

Analysis of IL6R_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
(Intercept)          Age   Gendermale  
    0.10526      0.03331     -0.38379  

Degrees of Freedom: 1151 Total (i.e. Null);  1149 Residual
Null Deviance:      803.7 
Residual Deviance: 790.2    AIC: 796.2

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3792   0.3949   0.4577   0.5226   0.8703  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)   
(Intercept)           0.14037    0.70096   0.200  0.84129   
currentDF[, PROTEIN] -0.11502    0.09484  -1.213  0.22520   
Age                   0.03295    0.01023   3.222  0.00127 **
Gendermale           -0.39123    0.22092  -1.771  0.07658 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 803.71  on 1151  degrees of freedom
Residual deviance: 788.73  on 1148  degrees of freedom
AIC: 796.73

Number of Fisher Scoring iterations: 5

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: -0.115023 
Standard error............: 0.094838 
Odds ratio (effect size)..: 0.891 
Lower 95% CI..............: 0.74 
Upper 95% CI..............: 1.073 
Z-value...................: -1.212829 
P-value...................: 0.2251951 
Hosmer and Lemeshow r^2...: 0.018632 
Cox and Snell r^2.........: 0.012915 
Nagelkerke's pseudo r^2...: 0.025714 
Sample size of AE DB......: 2388 
Sample size of model......: 1152 
Missing data %............: 51.75879 

Analysis of MCP1_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Coefficients:
         (Intercept)  currentDF[, PROTEIN]                   Age            Gendermale  
             0.24802               0.26381               0.03239              -0.43504  

Degrees of Freedom: 1195 Total (i.e. Null);  1192 Residual
Null Deviance:      826.5 
Residual Deviance: 804.7    AIC: 812.7

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5655   0.3738   0.4440   0.5167   0.8433  

Coefficients:
                     Estimate Std. Error z value Pr(>|z|)   
(Intercept)           0.24802    0.69361   0.358  0.72066   
currentDF[, PROTEIN]  0.26381    0.09370   2.816  0.00487 **
Age                   0.03239    0.01011   3.203  0.00136 **
Gendermale           -0.43504    0.21791  -1.996  0.04589 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 826.52  on 1195  degrees of freedom
Residual deviance: 804.68  on 1192  degrees of freedom
AIC: 812.68

Number of Fisher Scoring iterations: 5

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.263812 
Standard error............: 0.093697 
Odds ratio (effect size)..: 1.302 
Lower 95% CI..............: 1.083 
Upper 95% CI..............: 1.564 
Z-value...................: 2.815595 
P-value...................: 0.004868694 
Hosmer and Lemeshow r^2...: 0.026421 
Cox and Snell r^2.........: 0.018093 
Nagelkerke's pseudo r^2...: 0.036261 
Sample size of AE DB......: 2388 
Sample size of model......: 1196 
Missing data %............: 49.91625 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "Z-value", "P-value", "r^2_l", "r^2_cs", "r^2_nagelkerke", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`Z-value` <- as.numeric(GLM.results$`Z-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2_l` <- as.numeric(GLM.results$`r^2_l`)
GLM.results$`r^2_cs` <- as.numeric(GLM.results$`r^2_cs`)
GLM.results$`r^2_nagelkerke` <- as.numeric(GLM.results$`r^2_nagelkerke`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Bin.Uni.Protein.RANK.Symptoms.MODEL1.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Bin.Uni.Symptoms")

# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Model 2

In this model we correct for Age, Gender, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis..


GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "AsymptSympt"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate

    fit <- glm(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent +
                Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI +
                CAD_history + Stroke_history + Peripheral.interv + stenose, 
              data  =  currentDF, family = binomial(link = "logit"))
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 16, nrow = 0))
    GLM.results.TEMP[1,] = GLM.BIN(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }

Analysis of IL6_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Stroke_history + 
    Peripheral.interv, family = binomial(link = "logit"), data = currentDF)

Coefficients:
      (Intercept)     Stroke_history  Peripheral.interv  
           1.4460             1.5481            -0.9696  

Degrees of Freedom: 480 Total (i.e. Null);  478 Residual
Null Deviance:      448.7 
Residual Deviance: 411  AIC: 417

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8207   0.2472   0.4518   0.6797   1.2683  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.547e+01  1.350e+03   0.011 0.990858    
currentDF[, PROTEIN]      -1.637e-01  1.341e-01  -1.221 0.222219    
Age                        2.709e-02  1.676e-02   1.616 0.106099    
Gendermale                -1.779e-01  2.976e-01  -0.598 0.549922    
Hypertension.compositeyes -5.697e-01  4.359e-01  -1.307 0.191211    
DiabetesStatusDiabetes     3.403e-01  3.345e-01   1.017 0.308976    
SmokerCurrentyes           1.065e-01  2.813e-01   0.379 0.704984    
Med.Statin.LLDyes         -1.716e-01  3.130e-01  -0.548 0.583524    
Med.all.antiplateletyes   -6.819e-01  5.289e-01  -1.289 0.197347    
GFR_MDRD                   1.046e-02  7.628e-03   1.371 0.170375    
BMI                       -8.104e-03  3.455e-02  -0.235 0.814531    
CAD_history               -8.513e-02  2.809e-01  -0.303 0.761814    
Stroke_history             1.578e+00  3.808e-01   4.143 3.42e-05 ***
Peripheral.interv         -9.874e-01  2.864e-01  -3.448 0.000564 ***
stenose50-70%             -1.393e+01  1.350e+03  -0.010 0.991766    
stenose70-90%             -1.532e+01  1.350e+03  -0.011 0.990946    
stenose90-99%             -1.486e+01  1.350e+03  -0.011 0.991218    
stenose100% (Occlusion)   -1.371e-01  1.610e+03   0.000 0.999932    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 448.65  on 480  degrees of freedom
Residual deviance: 393.24  on 463  degrees of freedom
AIC: 429.24

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: -0.163678 
Standard error............: 0.134091 
Odds ratio (effect size)..: 0.849 
Lower 95% CI..............: 0.653 
Upper 95% CI..............: 1.104 
Z-value...................: -1.220648 
P-value...................: 0.2222193 
Hosmer and Lemeshow r^2...: 0.123507 
Cox and Snell r^2.........: 0.108813 
Nagelkerke's pseudo r^2...: 0.179402 
Sample size of AE DB......: 2388 
Sample size of model......: 481 
Missing data %............: 79.85762 

Analysis of MCP1_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Med.all.antiplatelet + Stroke_history + Peripheral.interv, 
    family = binomial(link = "logit"), data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]  Med.all.antiplateletyes           Stroke_history        Peripheral.interv  
                 2.1710                   0.3020                  -0.7129                   1.6297                  -0.9739  

Degrees of Freedom: 513 Total (i.e. Null);  509 Residual
Null Deviance:      457.8 
Residual Deviance: 409  AIC: 419

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8828   0.2333   0.4237   0.6299   1.2824  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.496e+01  1.305e+03   0.011 0.990854    
currentDF[, PROTEIN]       3.464e-01  1.367e-01   2.534 0.011287 *  
Age                        2.580e-02  1.666e-02   1.549 0.121368    
Gendermale                -2.685e-01  2.997e-01  -0.896 0.370282    
Hypertension.compositeyes -5.009e-01  4.399e-01  -1.139 0.254855    
DiabetesStatusDiabetes     2.651e-01  3.307e-01   0.802 0.422680    
SmokerCurrentyes           7.686e-02  2.804e-01   0.274 0.783994    
Med.Statin.LLDyes         -4.258e-02  3.194e-01  -0.133 0.893950    
Med.all.antiplateletyes   -8.355e-01  5.289e-01  -1.580 0.114152    
GFR_MDRD                   8.463e-03  7.526e-03   1.125 0.260766    
BMI                        1.930e-02  3.529e-02   0.547 0.584325    
CAD_history               -2.171e-01  2.814e-01  -0.771 0.440413    
Stroke_history             1.598e+00  3.795e-01   4.210 2.55e-05 ***
Peripheral.interv         -9.893e-01  2.939e-01  -3.367 0.000761 ***
stenose50-70%             -1.353e+01  1.305e+03  -0.010 0.991724    
stenose70-90%             -1.511e+01  1.305e+03  -0.012 0.990760    
stenose90-99%             -1.466e+01  1.305e+03  -0.011 0.991034    
stenose100% (Occlusion)   -1.429e-01  1.629e+03   0.000 0.999930    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 457.77  on 513  degrees of freedom
Residual deviance: 395.26  on 496  degrees of freedom
AIC: 431.26

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.346429 
Standard error............: 0.136729 
Odds ratio (effect size)..: 1.414 
Lower 95% CI..............: 1.082 
Upper 95% CI..............: 1.849 
Z-value...................: 2.533683 
P-value...................: 0.01128706 
Hosmer and Lemeshow r^2...: 0.136557 
Cox and Snell r^2.........: 0.114514 
Nagelkerke's pseudo r^2...: 0.194226 
Sample size of AE DB......: 2388 
Sample size of model......: 514 
Missing data %............: 78.47571 

Analysis of IL6_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ Age + Gender + 
    Med.all.antiplatelet + GFR_MDRD + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Coefficients:
            (Intercept)                      Age               Gendermale  Med.all.antiplateletyes                 GFR_MDRD  
              15.387606                 0.027762                -0.453161                -0.916880                 0.008104  
         Stroke_history        Peripheral.interv            stenose50-70%            stenose70-90%            stenose90-99%  
               1.166727                -0.673292               -13.748714               -14.870639               -14.701591  
stenose100% (Occlusion)            stenose50-99%            stenose70-99%  
              -0.331218               -16.941956                -0.167408  

Degrees of Freedom: 1008 Total (i.e. Null);  996 Residual
Null Deviance:      707.6 
Residual Deviance: 652.1    AIC: 678.1

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8197   0.2654   0.4021   0.5591   0.9812  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.553e+01  1.027e+03   0.015 0.987936    
currentDF[, PROTEIN]       6.163e-02  1.053e-01   0.585 0.558336    
Age                        3.155e-02  1.295e-02   2.436 0.014857 *  
Gendermale                -4.004e-01  2.443e-01  -1.639 0.101287    
Hypertension.compositeyes -2.983e-01  3.648e-01  -0.818 0.413500    
DiabetesStatusDiabetes    -8.036e-03  2.508e-01  -0.032 0.974442    
SmokerCurrentyes           1.551e-01  2.332e-01   0.665 0.505947    
Med.Statin.LLDyes         -1.778e-01  2.733e-01  -0.651 0.515164    
Med.all.antiplateletyes   -9.050e-01  4.485e-01  -2.018 0.043614 *  
GFR_MDRD                   7.277e-03  5.677e-03   1.282 0.199907    
BMI                        9.863e-04  2.892e-02   0.034 0.972798    
CAD_history               -1.788e-01  2.262e-01  -0.790 0.429472    
Stroke_history             1.108e+00  2.862e-01   3.870 0.000109 ***
Peripheral.interv         -6.265e-01  2.400e-01  -2.611 0.009031 ** 
stenose50-70%             -1.368e+01  1.027e+03  -0.013 0.989371    
stenose70-90%             -1.486e+01  1.027e+03  -0.014 0.988453    
stenose90-99%             -1.469e+01  1.027e+03  -0.014 0.988582    
stenose100% (Occlusion)   -4.303e-01  1.306e+03   0.000 0.999737    
stenose50-99%             -1.691e+01  1.027e+03  -0.016 0.986859    
stenose70-99%             -1.372e-01  1.233e+03   0.000 0.999911    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 707.63  on 1008  degrees of freedom
Residual deviance: 648.64  on  989  degrees of freedom
AIC: 688.64

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.061634 
Standard error............: 0.1053 
Odds ratio (effect size)..: 1.064 
Lower 95% CI..............: 0.865 
Upper 95% CI..............: 1.307 
Z-value...................: 0.585315 
P-value...................: 0.5583357 
Hosmer and Lemeshow r^2...: 0.083364 
Cox and Snell r^2.........: 0.056789 
Nagelkerke's pseudo r^2...: 0.11266 
Sample size of AE DB......: 2388 
Sample size of model......: 1009 
Missing data %............: 57.74707 

Analysis of IL6R_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Med.all.antiplatelet + CAD_history + Stroke_history + 
    Peripheral.interv, family = binomial(link = "logit"), data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]                      Age               Gendermale  Med.all.antiplateletyes  
                1.16545                 -0.16682                  0.02796                 -0.35834                 -0.82910  
            CAD_history           Stroke_history        Peripheral.interv  
               -0.35351                  1.02217                 -0.47073  

Degrees of Freedom: 1012 Total (i.e. Null);  1005 Residual
Null Deviance:      720.9 
Residual Deviance: 677.2    AIC: 693.2

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8361   0.2711   0.4157   0.5602   1.0121  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.566e+01  1.140e+03   0.014 0.989035    
currentDF[, PROTEIN]      -1.527e-01  1.016e-01  -1.503 0.132769    
Age                        3.521e-02  1.291e-02   2.728 0.006368 ** 
Gendermale                -4.077e-01  2.427e-01  -1.680 0.092969 .  
Hypertension.compositeyes -2.212e-01  3.506e-01  -0.631 0.528045    
DiabetesStatusDiabetes    -9.310e-03  2.471e-01  -0.038 0.969943    
SmokerCurrentyes           2.704e-01  2.313e-01   1.169 0.242377    
Med.Statin.LLDyes         -1.877e-01  2.725e-01  -0.689 0.491028    
Med.all.antiplateletyes   -8.710e-01  4.486e-01  -1.942 0.052179 .  
GFR_MDRD                   5.154e-03  5.688e-03   0.906 0.364834    
BMI                       -1.404e-02  2.963e-02  -0.474 0.635537    
CAD_history               -2.680e-01  2.228e-01  -1.203 0.228970    
Stroke_history             1.017e+00  2.712e-01   3.751 0.000176 ***
Peripheral.interv         -5.189e-01  2.410e-01  -2.153 0.031324 *  
stenose50-70%             -1.365e+01  1.140e+03  -0.012 0.990444    
stenose70-90%             -1.482e+01  1.140e+03  -0.013 0.989628    
stenose90-99%             -1.464e+01  1.140e+03  -0.013 0.989752    
stenose100% (Occlusion)   -3.777e-01  1.396e+03   0.000 0.999784    
stenose50-99%             -1.595e+01  1.140e+03  -0.014 0.988836    
stenose70-99%             -2.526e-01  1.330e+03   0.000 0.999848    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 720.94  on 1012  degrees of freedom
Residual deviance: 662.33  on  993  degrees of freedom
AIC: 702.33

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' IL6R_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: IL6R_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: -0.152701 
Standard error............: 0.101579 
Odds ratio (effect size)..: 0.858 
Lower 95% CI..............: 0.703 
Upper 95% CI..............: 1.047 
Z-value...................: -1.503271 
P-value...................: 0.1327691 
Hosmer and Lemeshow r^2...: 0.081298 
Cox and Snell r^2.........: 0.056217 
Nagelkerke's pseudo r^2...: 0.110406 
Sample size of AE DB......: 2388 
Sample size of model......: 1013 
Missing data %............: 57.57956 

Analysis of MCP1_pg_ug_2015_rank.

- processing AsymptSympt


Call:  glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Med.all.antiplatelet + GFR_MDRD + Stroke_history + 
    Peripheral.interv + stenose, family = binomial(link = "logit"), 
    data = currentDF)

Coefficients:
            (Intercept)     currentDF[, PROTEIN]                      Age               Gendermale  Med.all.antiplateletyes  
              15.272239                 0.246808                 0.031733                -0.519803                -0.925714  
               GFR_MDRD           Stroke_history        Peripheral.interv            stenose50-70%            stenose70-90%  
               0.008448                 1.056452                -0.572007               -13.826519               -15.017030  
          stenose90-99%  stenose100% (Occlusion)            stenose50-99%            stenose70-99%  
             -14.770785                -0.381146               -16.127189                -0.475975  

Degrees of Freedom: 1050 Total (i.e. Null);  1037 Residual
Null Deviance:      742.4 
Residual Deviance: 681.8    AIC: 709.8

Call:
glm(formula = as.factor(currentDF[, TRAIT]) ~ currentDF[, PROTEIN] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, family = binomial(link = "logit"), data = currentDF)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.9026   0.2665   0.4041   0.5510   1.1581  

Coefficients:
                            Estimate Std. Error z value Pr(>|z|)    
(Intercept)                1.535e+01  1.022e+03   0.015 0.988014    
currentDF[, PROTEIN]       2.327e-01  1.012e-01   2.299 0.021489 *  
Age                        3.628e-02  1.270e-02   2.857 0.004280 ** 
Gendermale                -4.583e-01  2.387e-01  -1.920 0.054877 .  
Hypertension.compositeyes -2.011e-01  3.509e-01  -0.573 0.566720    
DiabetesStatusDiabetes     5.331e-02  2.459e-01   0.217 0.828362    
SmokerCurrentyes           2.658e-01  2.291e-01   1.160 0.245990    
Med.Statin.LLDyes         -1.571e-01  2.708e-01  -0.580 0.561715    
Med.all.antiplateletyes   -9.184e-01  4.485e-01  -2.048 0.040595 *  
GFR_MDRD                   7.330e-03  5.560e-03   1.318 0.187367    
BMI                       -4.704e-03  2.790e-02  -0.169 0.866132    
CAD_history               -2.356e-01  2.191e-01  -1.076 0.282037    
Stroke_history             1.006e+00  2.713e-01   3.707 0.000209 ***
Peripheral.interv         -5.483e-01  2.366e-01  -2.317 0.020485 *  
stenose50-70%             -1.371e+01  1.022e+03  -0.013 0.989296    
stenose70-90%             -1.495e+01  1.022e+03  -0.015 0.988326    
stenose90-99%             -1.473e+01  1.022e+03  -0.014 0.988502    
stenose100% (Occlusion)   -4.325e-01  1.308e+03   0.000 0.999736    
stenose50-99%             -1.616e+01  1.022e+03  -0.016 0.987388    
stenose70-99%             -4.053e-01  1.231e+03   0.000 0.999737    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 742.44  on 1050  degrees of freedom
Residual deviance: 677.73  on 1031  degrees of freedom
AIC: 717.73

Number of Fisher Scoring iterations: 15

Analyzing in dataset ' AEDB.CEA ' the association of ' MCP1_pg_ug_2015_rank ' with ' AsymptSympt ' ...
Collecting data...
We have collected the following and summarize it in an object:
Dataset...................: AEDB.CEA 
Score/Exposure/biomarker..: MCP1_pg_ug_2015_rank 
Trait/outcome.............: AsymptSympt 
Effect size...............: 0.232718 
Standard error............: 0.101213 
Odds ratio (effect size)..: 1.262 
Lower 95% CI..............: 1.035 
Upper 95% CI..............: 1.539 
Z-value...................: 2.299283 
P-value...................: 0.02148888 
Hosmer and Lemeshow r^2...: 0.087159 
Cox and Snell r^2.........: 0.059713 
Nagelkerke's pseudo r^2...: 0.117873 
Sample size of AE DB......: 2388 
Sample size of model......: 1051 
Missing data %............: 55.98828 
cat("Edit the column names...\n")
Edit the column names...
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "Z-value", "P-value", "r^2_l", "r^2_cs", "r^2_nagelkerke", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
Correct the variable types...
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`Z-value` <- as.numeric(GLM.results$`Z-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2_l` <- as.numeric(GLM.results$`r^2_l`)
GLM.results$`r^2_cs` <- as.numeric(GLM.results$`r^2_cs`)
GLM.results$`r^2_nagelkerke` <- as.numeric(GLM.results$`r^2_nagelkerke`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)

# Save the data
cat("Writing results to Excel-file...\n")
Writing results to Excel-file...
### Univariate
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Bin.Multi.Protein.RANK.Symptoms.MODEL2.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Bin.Multi.Symptoms")

# Removing intermediates
cat("Removing intermediate files...\n")
Removing intermediate files...
rm(TRAIT, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

C. Longitudinal analysis secondary clinical outcome

For the longitudinal analyses of plaque and plasma MCP1, IL6, and IL6R levels and secondary cardiovascular events over a three-year follow-up period.

The primary outcome is defined as “a composite of fatal or non-fatal myocardial infarction, fatal or non-fatal stroke, ruptured aortic aneurysm, fatal cardiac failure, coronary or peripheral interventions, leg amputation due to vascular causes, and cardiovascular death”, i.e. major adverse cardiovascular events (MACE). Variable: epmajor.3years, these include: - myocardial infarction (MI) - cerebral infarction (CVA/stroke) - cardiovascular death (exact cause to be investigated) - cerebral bleeding (CVA/stroke) - fatal myocardial infarction (MI) - fatal cerebral infarction - fatal cerebral bleeding - sudden death - fatal heart failure - fatal aneurysm rupture - other cardiovascular death..

The secondary outcomes will be

  • incidence of fatal or non-fatal stroke (ischemic and bleeding) - variable: epstroke.3years, these include:
    • cerebral infarction (CVA/stroke)
    • cerebral bleeding (CVA/stroke)
    • fatal cerebral infarction
    • fatal cerebral bleeding.
  • incidence of acute coronary events (fatal or non-fatal myocardial infarction, coronary interventions) - variable: epcoronary.3years, these include:
    • myocardial infarction (MI)
    • coronary angioplasty (PCI/PTCA)
    • cardiovascular death (exact cause to be investigated)
    • coronary bypass (CABG)
    • fatal myocardial infarction (MI)
    • sudden death.
  • cardiovascular death - variable: epcvdeath.3years, these include:
    • cardiovascular death (exact cause to be investigated)
    • fatal myocardial infarction (MI)
    • fatal cerebral infarction
    • fatal cerebral bleeding
    • sudden death
    • fatal heart failure
    • fatal aneurysm rupture
    • other cardiovascular death..

30- and 90-days FU events

We will use 3-year follow-up, but we will also calculate 30 days and 90 days follow-up ‘time-to-event’ variables. On average there are 365.25 days in a year. We can calculate 30-days and 90-days follow-up time based on the three years follow-up.

cutt.off.30days = (1/365.25) * 30
cutt.off.90days = (1/365.25) * 90

# Fix maximum FU of 30 and 90 days
AEDB <- AEDB %>%
  mutate(
    FU.cutt.off.30days = ifelse(max.followup <= cutt.off.30days, max.followup, cutt.off.30days),
    FU.cutt.off.90days = ifelse(max.followup <= cutt.off.90days, max.followup, cutt.off.90days)
  ) 

AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", 
                                      "max.followup", 
                                      "FU.cutt.off.3years",
                                      "FU.cutt.off.30days", 
                                      "FU.cutt.off.90days"))
require(labelled)
AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)

DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)


rm(AEDB.temp)

AEDB.CEA <- AEDB.CEA %>%
  mutate(
    FU.cutt.off.30days = ifelse(max.followup <= cutt.off.30days, max.followup, cutt.off.30days),
    FU.cutt.off.90days = ifelse(max.followup <= cutt.off.90days, max.followup, cutt.off.90days)
  ) 

AEDB.CEA.temp <- subset(AEDB.CEA,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", 
                                      "max.followup", 
                                      "FU.cutt.off.3years",
                                      "FU.cutt.off.30days", 
                                      "FU.cutt.off.90days"))
require(labelled)
AEDB.CEA.temp$Gender <- to_factor(AEDB.CEA.temp$Gender)
AEDB.CEA.temp$Hospital <- to_factor(AEDB.CEA.temp$Hospital)
AEDB.CEA.temp$Artery_summary <- to_factor(AEDB.CEA.temp$Artery_summary)

DT::datatable(AEDB.CEA.temp[1:10,], caption = "Excerpt of the whole AEDB.CEA.", rownames = FALSE)


rm(AEDB.CEA.temp)

Here we will calculate the new 30- and 90-days follow-up of the events and their event-times of interest:

  • MACE (epmajor.3years)
  • Stroke (epstroke.3years)
  • Coronary events (epcoronary.3years)
  • Cardiovascular death (epcvdeath.3years)
avg_days_in_year = 365.25
cutt.off.30days.scaled <- cutt.off.30days * 365.25
cutt.off.90days.scaled <- cutt.off.90days * 365.25
# Event times
AEDB <- AEDB %>%
  mutate(
    ep_major_t_30days = ifelse(ep_major_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                               ep_major_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_stroke_t_30days = ifelse(ep_stroke_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                ep_stroke_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_coronary_t_30days = ifelse(ep_coronary_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                  ep_coronary_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_cvdeath_t_30days = ifelse(ep_cvdeath_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                 ep_cvdeath_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_major_t_90days = ifelse(ep_major_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                               ep_major_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_stroke_t_90days = ifelse(ep_stroke_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                ep_stroke_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_coronary_t_90days = ifelse(ep_coronary_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                  ep_coronary_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_cvdeath_t_90days = ifelse(ep_cvdeath_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                 ep_cvdeath_t_3years * avg_days_in_year, cutt.off.90days.scaled)
  ) 

AEDB.CEA <- AEDB.CEA %>%
  mutate(
    ep_major_t_30days = ifelse(ep_major_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                               ep_major_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_stroke_t_30days = ifelse(ep_stroke_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                ep_stroke_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_coronary_t_30days = ifelse(ep_coronary_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                  ep_coronary_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_cvdeath_t_30days = ifelse(ep_cvdeath_t_3years * avg_days_in_year <= cutt.off.30days.scaled, 
                                 ep_cvdeath_t_3years * avg_days_in_year, cutt.off.30days.scaled),
    ep_major_t_90days = ifelse(ep_major_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                               ep_major_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_stroke_t_90days = ifelse(ep_stroke_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                ep_stroke_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_coronary_t_90days = ifelse(ep_coronary_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                  ep_coronary_t_3years * avg_days_in_year, cutt.off.90days.scaled),
    ep_cvdeath_t_90days = ifelse(ep_cvdeath_t_3years * avg_days_in_year <= cutt.off.90days.scaled, 
                                 ep_cvdeath_t_3years * avg_days_in_year, cutt.off.90days.scaled)
  ) 

attach(AEDB)
AEDB[,"epmajor.30days"] <- AEDB$epmajor.3years
AEDB$epmajor.30days[epmajor.3years == 1 & ep_major_t_3years > cutt.off.30days] <- 0

AEDB[,"epstroke.30days"] <- AEDB$epstroke.3years
AEDB$epstroke.30days[epstroke.3years == 1 & ep_stroke_t_3years > cutt.off.30days] <- 0

AEDB[,"epcoronary.30days"] <- AEDB$epcoronary.3years
AEDB$epcoronary.30days[epcoronary.3years == 1 & ep_coronary_t_3years > cutt.off.30days] <- 0

AEDB[,"epcvdeath.30days"] <- AEDB$epcvdeath.3years
AEDB$epcvdeath.30days[epcvdeath.3years == 1 & ep_cvdeath_t_3years > cutt.off.30days] <- 0

AEDB[,"epmajor.90days"] <- AEDB$epmajor.3years
AEDB$epmajor.90days[epmajor.3years == 1 & ep_major_t_3years > cutt.off.90days] <- 0

AEDB[,"epstroke.90days"] <- AEDB$epstroke.3years
AEDB$epstroke.90days[epstroke.3years == 1 & ep_stroke_t_3years > cutt.off.90days] <- 0

AEDB[,"epcoronary.90days"] <- AEDB$epcoronary.3years
AEDB$epcoronary.90days[epcoronary.3years == 1 & ep_coronary_t_3years > cutt.off.90days] <- 0

AEDB[,"epcvdeath.90days"] <- AEDB$epcvdeath.3years
AEDB$epcvdeath.90days[epcvdeath.3years == 1 & ep_cvdeath_t_3years > cutt.off.90days] <- 0

detach(AEDB)

AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", 
                                      "epmajor.3years", "epstroke.3years", "epcoronary.3years", "epcvdeath.3years",
                                      "epmajor.30days", "epstroke.30days", "epcoronary.30days", "epcvdeath.30days",
                                      "epmajor.90days", "epstroke.90days", "epcoronary.90days", "epcvdeath.90days"))
require(labelled)
AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)

DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)


rm(AEDB.temp)

attach(AEDB.CEA)
AEDB.CEA[,"epmajor.30days"] <- AEDB.CEA$epmajor.3years
AEDB.CEA$epmajor.30days[epmajor.3years == 1 & ep_major_t_3years > cutt.off.30days] <- 0

AEDB.CEA[,"epstroke.30days"] <- AEDB.CEA$epstroke.3years
AEDB.CEA$epstroke.30days[epstroke.3years == 1 & ep_stroke_t_3years > cutt.off.30days] <- 0

AEDB.CEA[,"epcoronary.30days"] <- AEDB.CEA$epcoronary.3years
AEDB.CEA$epcoronary.30days[epcoronary.3years == 1 & ep_coronary_t_3years > cutt.off.30days] <- 0

AEDB.CEA[,"epcvdeath.30days"] <- AEDB.CEA$epcvdeath.3years
AEDB.CEA$epcvdeath.30days[epcvdeath.3years == 1 & ep_cvdeath_t_3years > cutt.off.30days] <- 0

AEDB.CEA[,"epmajor.90days"] <- AEDB.CEA$epmajor.3years
AEDB.CEA$epmajor.90days[epmajor.3years == 1 & ep_major_t_3years > cutt.off.90days] <- 0

AEDB.CEA[,"epstroke.90days"] <- AEDB.CEA$epstroke.3years
AEDB.CEA$epstroke.90days[epstroke.3years == 1 & ep_stroke_t_3years > cutt.off.90days] <- 0

AEDB.CEA[,"epcoronary.90days"] <- AEDB.CEA$epcoronary.3years
AEDB.CEA$epcoronary.90days[epcoronary.3years == 1 & ep_coronary_t_3years > cutt.off.90days] <- 0

AEDB.CEA[,"epcvdeath.90days"] <- AEDB.CEA$epcvdeath.3years
AEDB.CEA$epcvdeath.90days[epcvdeath.3years == 1 & ep_cvdeath_t_3years > cutt.off.90days] <- 0

detach(AEDB.CEA)

AEDB.CEA.temp <- subset(AEDB.CEA,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", 
                                      "epmajor.3years", "epstroke.3years", "epcoronary.3years", "epcvdeath.3years",
                                      "epmajor.30days", "epstroke.30days", "epcoronary.30days", "epcvdeath.30days",
                                      "epmajor.90days", "epstroke.90days", "epcoronary.90days", "epcvdeath.90days"))
require(labelled)
AEDB.CEA.temp$Gender <- to_factor(AEDB.CEA.temp$Gender)
AEDB.CEA.temp$Hospital <- to_factor(AEDB.CEA.temp$Hospital)
AEDB.CEA.temp$Artery_summary <- to_factor(AEDB.CEA.temp$Artery_summary)

DT::datatable(AEDB.CEA.temp[1:10,], caption = "Excerpt of the whole AEDB.CEA.", rownames = FALSE)


rm(AEDB.CEA.temp)

Sanity checks

First we do some sanity checks and inventory the time-to-event and event variables.

# Reference: https://bioconductor.org/packages/devel/bioc/vignettes/MultiAssayExperiment/inst/doc/QuickStartMultiAssay.html
# If you want to suppress warnings and messages when installing/loading packages
# suppressPackageStartupMessages({})
install.packages.auto("survival")
install.packages.auto("survminer")
install.packages.auto("Hmisc")

cat("* Creating function to summarize Cox regression and prepare container for results.")
* Creating function to summarize Cox regression and prepare container for results.
# Function to get summary statistics from Cox regression model
COX.STAT <- function(coxfit, DATASET, OUTCOME, protein){
  cat("Summarizing Cox regression results for '", protein ,"' and its association to '",OUTCOME,"' in '",DATASET,"'.\n")
  if (nrow(summary(coxfit)$coefficients) == 1) {
    output = c(protein, rep(NA,8))
    cat("Model not fitted; probably singular.\n")
  }else {
    cat("Collecting data.\n\n")
    cox.sum <- summary(coxfit)
    cox.effectsize = cox.sum$coefficients[1,1]
    cox.SE = cox.sum$coefficients[1,3]
    cox.HReffect = cox.sum$coefficients[1,2]
    cox.CI_low = exp(cox.effectsize - 1.96 * cox.SE)
    cox.CI_up = exp(cox.effectsize + 1.96 * cox.SE)
    cox.zvalue = cox.sum$coefficients[1,4]
    cox.pvalue = cox.sum$coefficients[1,5]
    cox.sample_size = cox.sum$n
    cox.nevents = cox.sum$nevent
    
    output = c(DATASET, OUTCOME, protein, cox.effectsize, cox.SE, cox.HReffect, cox.CI_low, cox.CI_up, cox.zvalue, cox.pvalue, cox.sample_size, cox.nevents)
    cat("We have collected the following:\n")
    cat("Dataset used..............:", DATASET, "\n")
    cat("Outcome analyzed..........:", OUTCOME, "\n")
    cat("Protein...................:", protein, "\n")
    cat("Effect size...............:", round(cox.effectsize, 6), "\n")
    cat("Standard error............:", round(cox.SE, 6), "\n")
    cat("Odds ratio (effect size)..:", round(cox.HReffect, 3), "\n")
    cat("Lower 95% CI..............:", round(cox.CI_low, 3), "\n")
    cat("Upper 95% CI..............:", round(cox.CI_up, 3), "\n")
    cat("T-value...................:", round(cox.zvalue, 6), "\n")
    cat("P-value...................:", signif(cox.pvalue, 8), "\n")
    cat("Sample size in model......:", cox.sample_size, "\n")
    cat("Number of events..........:", cox.nevents, "\n")
  }
  return(output)
  print(output)
} 

times = c("ep_major_t_3years", 
          "ep_stroke_t_3years", "ep_coronary_t_3years", "ep_cvdeath_t_3years")

endpoints = c("epmajor.3years", 
              "epstroke.3years", "epcoronary.3years", "epcvdeath.3years")

cat("* Check the cases per event type - for sanity.")
* Check the cases per event type - for sanity.
for (events in endpoints){
  require(labelled)
  print(paste0("Printing the summary of: ",events))
  # print(summary(AEDB.CEA[,events]))
  print(table(AEDB.CEA[,events]))
}
[1] "Printing the summary of: epmajor.3years"

   0    1 
2002  259 
[1] "Printing the summary of: epstroke.3years"

   0    1 
2134  128 
[1] "Printing the summary of: epcoronary.3years"

   0    1 
2085  177 
[1] "Printing the summary of: epcvdeath.3years"

   0    1 
2173   88 
cat("* Check distribution of events over time - for sanity.")
* Check distribution of events over time - for sanity.
for (eventtimes in times){
  print(paste0("Printing the summary of: ",eventtimes))
  print(summary(AEDB.CEA[,eventtimes]))
}
[1] "Printing the summary of: ep_major_t_3years"
 ep_major_t_3years
 Min.   :0.000    
 1st Qu.:2.770    
 Median :3.000    
 Mean   :2.585    
 3rd Qu.:3.000    
 Max.   :3.000    
 NA's   :129      
[1] "Printing the summary of: ep_stroke_t_3years"
 ep_stroke_t_3years
 Min.   :0.000     
 1st Qu.:2.890     
 Median :3.000     
 Mean   :2.636     
 3rd Qu.:3.000     
 Max.   :3.000     
 NA's   :129       
[1] "Printing the summary of: ep_coronary_t_3years"
 ep_coronary_t_3years
 Min.   :0.000       
 1st Qu.:2.851       
 Median :3.000       
 Mean   :2.637       
 3rd Qu.:3.000       
 Max.   :3.000       
 NA's   :129         
[1] "Printing the summary of: ep_cvdeath_t_3years"
 ep_cvdeath_t_3years
 Min.   :0.00274    
 1st Qu.:2.91781    
 Median :3.00000    
 Mean   :2.72214    
 3rd Qu.:3.00000    
 Max.   :3.00000    
 NA's   :129        
for (eventtime in times){
  
  print(paste0("Printing the distribution of: ",eventtime))
  p <- gghistogram(AEDB.CEA, x = eventtime, y = "..count..",
              main = eventtime, bins = 15, 
              xlab = "year", color = uithof_color[16], fill = uithof_color[16], ggtheme = theme_minimal()) 
 print(p)
 ggsave(file = paste0(PLOT_loc, "/",Today,".AEDB.CEA.EventDistributionPerYear.",eventtime,".pdf"), plot = last_plot())
}
[1] "Printing the distribution of: ep_major_t_3years"
[1] "Printing the distribution of: ep_stroke_t_3years"
[1] "Printing the distribution of: ep_coronary_t_3years"
[1] "Printing the distribution of: ep_cvdeath_t_3years"

times30 = c("ep_major_t_30days", 
          "ep_stroke_t_30days", "ep_coronary_t_30days", "ep_cvdeath_t_30days")

endpoints30 = c("epmajor.30days", 
              "epstroke.30days", "epcoronary.30days", "epcvdeath.30days")

cat("* Check the cases per event type - for sanity.")
* Check the cases per event type - for sanity.
for (events in endpoints30){
  print(paste0("Printing the summary of: ",events))
  # print(summary(AEDB.CEA[,events]))
  print(table(AEDB.CEA[,events]))
}
[1] "Printing the summary of: epmajor.30days"

   0    1 
2186   75 
[1] "Printing the summary of: epstroke.30days"

   0    1 
2209   53 
[1] "Printing the summary of: epcoronary.30days"

   0    1 
2231   31 
[1] "Printing the summary of: epcvdeath.30days"

   0    1 
2250   11 
cat("* Check distribution of events over time - for sanity.")
* Check distribution of events over time - for sanity.
for (eventtimes in times30){
  print(paste0("Printing the summary of: ",eventtimes))
  print(summary(AEDB.CEA[,eventtimes]))
}
[1] "Printing the summary of: ep_major_t_30days"
 ep_major_t_30days
 Min.   : 0.00    
 1st Qu.:30.00    
 Median :30.00    
 Mean   :29.11    
 3rd Qu.:30.00    
 Max.   :30.00    
 NA's   :129      
[1] "Printing the summary of: ep_stroke_t_30days"
 ep_stroke_t_30days
 Min.   : 0.00     
 1st Qu.:30.00     
 Median :30.00     
 Mean   :29.32     
 3rd Qu.:30.00     
 Max.   :30.00     
 NA's   :129       
[1] "Printing the summary of: ep_coronary_t_30days"
 ep_coronary_t_30days
 Min.   : 0.00       
 1st Qu.:30.00       
 Median :30.00       
 Mean   :29.57       
 3rd Qu.:30.00       
 Max.   :30.00       
 NA's   :129         
[1] "Printing the summary of: ep_cvdeath_t_30days"
 ep_cvdeath_t_30days
 Min.   : 1.001     
 1st Qu.:30.000     
 Median :30.000     
 Mean   :29.864     
 3rd Qu.:30.000     
 Max.   :30.000     
 NA's   :129        
for (eventtime in times30){
  
  print(paste0("Printing the distribution of: ",eventtime))
  p <- gghistogram(AEDB.CEA, x = eventtime, y = "..count..",
              main = eventtime, bins = 15, 
              xlab = "days", color = uithof_color[16], fill = uithof_color[16], ggtheme = theme_minimal()) 
 print(p)
 ggsave(file = paste0(PLOT_loc, "/",Today,".AEDB.CEA.EventDistributionPer30Days.",eventtime,".pdf"), plot = last_plot())
}
[1] "Printing the distribution of: ep_major_t_30days"
[1] "Printing the distribution of: ep_stroke_t_30days"
[1] "Printing the distribution of: ep_coronary_t_30days"
[1] "Printing the distribution of: ep_cvdeath_t_30days"

times90 = c("ep_major_t_90days", 
          "ep_stroke_t_90days", "ep_coronary_t_90days", "ep_cvdeath_t_90days")

endpoints90 = c("epmajor.90days", 
              "epstroke.90days", "epcoronary.90days", "epcvdeath.90days")

cat("* Check the cases per event type - for sanity.")
* Check the cases per event type - for sanity.
for (events in endpoints90){
  print(paste0("Printing the summary of: ",events))
  # print(summary(AEDB.CEA[,events]))
  print(table(AEDB.CEA[,events]))
}
[1] "Printing the summary of: epmajor.90days"

   0    1 
2170   91 
[1] "Printing the summary of: epstroke.90days"

   0    1 
2202   60 
[1] "Printing the summary of: epcoronary.90days"

   0    1 
2222   40 
[1] "Printing the summary of: epcvdeath.90days"

   0    1 
2243   18 
cat("* Check distribution of events over time - for sanity.")
* Check distribution of events over time - for sanity.
for (eventtimes in times90){
  print(paste0("Printing the summary of: ",eventtimes))
  print(summary(AEDB.CEA[,eventtimes]))
}
[1] "Printing the summary of: ep_major_t_90days"
 ep_major_t_90days
 Min.   : 0.00    
 1st Qu.:90.00    
 Median :90.00    
 Mean   :86.81    
 3rd Qu.:90.00    
 Max.   :90.00    
 NA's   :129      
[1] "Printing the summary of: ep_stroke_t_90days"
 ep_stroke_t_90days
 Min.   : 0.00     
 1st Qu.:90.00     
 Median :90.00     
 Mean   :87.52     
 3rd Qu.:90.00     
 Max.   :90.00     
 NA's   :129       
[1] "Printing the summary of: ep_coronary_t_90days"
 ep_coronary_t_90days
 Min.   : 0.00       
 1st Qu.:90.00       
 Median :90.00       
 Mean   :88.32       
 3rd Qu.:90.00       
 Max.   :90.00       
 NA's   :129         
[1] "Printing the summary of: ep_cvdeath_t_90days"
 ep_cvdeath_t_90days
 Min.   : 1.001     
 1st Qu.:90.000     
 Median :90.000     
 Mean   :89.357     
 3rd Qu.:90.000     
 Max.   :90.000     
 NA's   :129        
for (eventtime in times90){
  
  print(paste0("Printing the distribution of: ",eventtime))
  p <- gghistogram(AEDB.CEA, x = eventtime, y = "..count..",
              main = eventtime, bins = 15, 
              xlab = "days", color = uithof_color[16], fill = uithof_color[16], ggtheme = theme_minimal()) 
 print(p)
 ggsave(file = paste0(PLOT_loc, "/",Today,".AEDB.CEA.EventDistributionPer90Days.",eventtime,".pdf"), plot = last_plot())
}
[1] "Printing the distribution of: ep_major_t_90days"
[1] "Printing the distribution of: ep_stroke_t_90days"
[1] "Printing the distribution of: ep_coronary_t_90days"
[1] "Printing the distribution of: ep_cvdeath_t_90days"

Cox regressions

Let’s perform the actual Cox-regressions. We will apply a couple of models:

  • Model 1: adjusted for age, sex, and year of surgery
  • Model 2: adjusted for age, sex, year of surgery, hypertension, diabetes, smoking, LDL-C levels, lipid-lowering drugs, antiplatelet drugs, eGFR, BMI, history of CVD, level of stenosis

3 years follow-up

MODEL 1

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times)){
  eptime = times[i]
  ep = endpoints[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [years]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 1 (Simple model)
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age+Gender, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age+Gender, data = TEMP.DF)

    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         # ylim = c(0.2, 1), xlim = c(0,3), col = c("#595A5C", "#DB003F", "#1290D9"),
         ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [years]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL1.pdf"), height = 12, width = 10, onefile = TRUE)
    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}
* Analyzing the effect of plaque proteins on [epmajor.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 522, number of events= 70 
   (1866 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 0.15269   1.16496  0.23974 0.637  0.52420   
Age                                                       0.03853   1.03928  0.01471 2.620  0.00879 **
Gendermale                                                0.78339   2.18888  0.32848 2.385  0.01708 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]     1.165     0.8584    0.7282     1.864
Age                                                           1.039     0.9622    1.0098     1.070
Gendermale                                                    2.189     0.4569    1.1498     4.167

Concordance= 0.632  (se = 0.036 )
Likelihood ratio test= 14.17  on 3 df,   p=0.003
Wald test            = 12.77  on 3 df,   p=0.005
Score (logrank) test = 13.09  on 3 df,   p=0.004


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6_rank 
Effect size...............: 0.152688 
Standard error............: 0.239742 
Odds ratio (effect size)..: 1.165 
Lower 95% CI..............: 0.728 
Upper 95% CI..............: 1.864 
T-value...................: 0.636883 
P-value...................: 0.524201 
Sample size in model......: 522 
Number of events..........: 70 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 558, number of events= 72 
   (1830 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -0.20048   0.81834  0.23746 -0.844   0.3985  
Age                                                        0.03070   1.03117  0.01446  2.123   0.0338 *
Gendermale                                                 0.81021   2.24838  0.32813  2.469   0.0135 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635]    0.8183     1.2220    0.5138     1.303
Age                                                          1.0312     0.9698    1.0024     1.061
Gendermale                                                   2.2484     0.4448    1.1819     4.277

Concordance= 0.62  (se = 0.035 )
Likelihood ratio test= 12.85  on 3 df,   p=0.005
Wald test            = 11.56  on 3 df,   p=0.009
Score (logrank) test = 11.89  on 3 df,   p=0.008


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.200476 
Standard error............: 0.237458 
Odds ratio (effect size)..: 0.818 
Lower 95% CI..............: 0.514 
Upper 95% CI..............: 1.303 
T-value...................: -0.844258 
P-value...................: 0.3985254 
Sample size in model......: 558 
Number of events..........: 72 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1141, number of events= 133 
   (1247 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] -0.03418   0.96640  0.17344 -0.197 0.843795    
Age                                                        0.03487   1.03549  0.01013  3.441 0.000579 ***
Gendermale                                                 0.44653   1.56287  0.21004  2.126 0.033515 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]    0.9664     1.0348    0.6879     1.358
Age                                                          1.0355     0.9657    1.0151     1.056
Gendermale                                                   1.5629     0.6398    1.0355     2.359

Concordance= 0.597  (se = 0.026 )
Likelihood ratio test= 17.19  on 3 df,   p=6e-04
Wald test            = 16.13  on 3 df,   p=0.001
Score (logrank) test = 16.22  on 3 df,   p=0.001


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: -0.034175 
Standard error............: 0.173443 
Odds ratio (effect size)..: 0.966 
Lower 95% CI..............: 0.688 
Upper 95% CI..............: 1.358 
T-value...................: -0.197041 
P-value...................: 0.8437952 
Sample size in model......: 1141 
Number of events..........: 133 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1143, number of events= 137 
   (1245 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)     z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 0.448497  1.565956 0.174488 2.570 0.010159 *  
Age                                                       0.033432  1.033997 0.009989 3.347 0.000817 ***
Gendermale                                                0.335403  1.398504 0.201961 1.661 0.096766 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]     1.566     0.6386    1.1124     2.204
Age                                                           1.034     0.9671    1.0140     1.054
Gendermale                                                    1.399     0.7150    0.9414     2.078

Concordance= 0.607  (se = 0.024 )
Likelihood ratio test= 20.48  on 3 df,   p=1e-04
Wald test            = 19.65  on 3 df,   p=2e-04
Score (logrank) test = 19.73  on 3 df,   p=2e-04


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.448497 
Standard error............: 0.174488 
Odds ratio (effect size)..: 1.566 
Lower 95% CI..............: 1.112 
Upper 95% CI..............: 2.204 
T-value...................: 2.570364 
P-value...................: 0.01015916 
Sample size in model......: 1143 
Number of events..........: 137 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1187, number of events= 139 
   (1201 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)     z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 0.037312  1.038016 0.169989 0.219 0.826266    
Age                                                       0.033060  1.033613 0.009864 3.351 0.000804 ***
Gendermale                                                0.343970  1.410536 0.199674 1.723 0.084950 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]     1.038     0.9634    0.7439     1.448
Age                                                           1.034     0.9675    1.0138     1.054
Gendermale                                                    1.411     0.7090    0.9537     2.086

Concordance= 0.587  (se = 0.025 )
Likelihood ratio test= 14.94  on 3 df,   p=0.002
Wald test            = 14.19  on 3 df,   p=0.003
Score (logrank) test = 14.26  on 3 df,   p=0.003


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: 0.037312 
Standard error............: 0.169989 
Odds ratio (effect size)..: 1.038 
Lower 95% CI..............: 0.744 
Upper 95% CI..............: 1.448 
T-value...................: 0.219494 
P-value...................: 0.8262655 
Sample size in model......: 1187 
Number of events..........: 139 
* Analyzing the effect of plaque proteins on [epstroke.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 522, number of events= 37 
   (1866 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 0.07624   1.07922  0.32935 0.231    0.817
Age                                                       0.02809   1.02849  0.01976 1.422    0.155
Gendermale                                                0.20807   1.23130  0.38325 0.543    0.587

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]     1.079     0.9266    0.5659     2.058
Age                                                           1.028     0.9723    0.9894     1.069
Gendermale                                                    1.231     0.8122    0.5809     2.610

Concordance= 0.569  (se = 0.051 )
Likelihood ratio test= 2.43  on 3 df,   p=0.5
Wald test            = 2.35  on 3 df,   p=0.5
Score (logrank) test = 2.35  on 3 df,   p=0.5


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6_rank 
Effect size...............: 0.076241 
Standard error............: 0.329345 
Odds ratio (effect size)..: 1.079 
Lower 95% CI..............: 0.566 
Upper 95% CI..............: 2.058 
T-value...................: 0.231493 
P-value...................: 0.8169321 
Sample size in model......: 522 
Number of events..........: 37 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 558, number of events= 38 
   (1830 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -0.33054   0.71854  0.32977 -1.002    0.316
Age                                                        0.01603   1.01615  0.01930  0.830    0.406
Gendermale                                                 0.26127   1.29858  0.38266  0.683    0.495

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635]    0.7185     1.3917    0.3765     1.371
Age                                                          1.0162     0.9841    0.9784     1.055
Gendermale                                                   1.2986     0.7701    0.6134     2.749

Concordance= 0.558  (se = 0.044 )
Likelihood ratio test= 2.22  on 3 df,   p=0.5
Wald test            = 2.2  on 3 df,   p=0.5
Score (logrank) test = 2.21  on 3 df,   p=0.5


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.330541 
Standard error............: 0.329767 
Odds ratio (effect size)..: 0.719 
Lower 95% CI..............: 0.376 
Upper 95% CI..............: 1.371 
T-value...................: -1.002346 
P-value...................: 0.3161763 
Sample size in model......: 558 
Number of events..........: 38 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1141, number of events= 69 
   (1247 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] -0.17128   0.84258  0.24143 -0.709  0.47805   
Age                                                        0.03832   1.03907  0.01407  2.724  0.00645 **
Gendermale                                                 0.12792   1.13646  0.26956  0.475  0.63511   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]    0.8426     1.1868    0.5249     1.352
Age                                                          1.0391     0.9624    1.0108     1.068
Gendermale                                                   1.1365     0.8799    0.6700     1.928

Concordance= 0.601  (se = 0.035 )
Likelihood ratio test= 8.42  on 3 df,   p=0.04
Wald test            = 8.05  on 3 df,   p=0.05
Score (logrank) test = 8.1  on 3 df,   p=0.04


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: -0.171284 
Standard error............: 0.241434 
Odds ratio (effect size)..: 0.843 
Lower 95% CI..............: 0.525 
Upper 95% CI..............: 1.352 
T-value...................: -0.709446 
P-value...................: 0.4780475 
Sample size in model......: 1141 
Number of events..........: 69 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1143, number of events= 72 
   (1245 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 0.37431   1.45399  0.23932 1.564   0.1178  
Age                                                       0.03294   1.03349  0.01373 2.400   0.0164 *
Gendermale                                                0.09556   1.10027  0.26316 0.363   0.7165  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]     1.454     0.6878    0.9096     2.324
Age                                                           1.033     0.9676    1.0061     1.062
Gendermale                                                    1.100     0.9089    0.6569     1.843

Concordance= 0.593  (se = 0.034 )
Likelihood ratio test= 8.25  on 3 df,   p=0.04
Wald test            = 7.97  on 3 df,   p=0.05
Score (logrank) test = 8  on 3 df,   p=0.05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.374314 
Standard error............: 0.239317 
Odds ratio (effect size)..: 1.454 
Lower 95% CI..............: 0.91 
Upper 95% CI..............: 2.324 
T-value...................: 1.564093 
P-value...................: 0.1177957 
Sample size in model......: 1143 
Number of events..........: 72 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1187, number of events= 73 
   (1201 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 0.13635   1.14608  0.23507 0.580   0.5619  
Age                                                       0.03393   1.03451  0.01354 2.505   0.0122 *
Gendermale                                                0.07048   1.07302  0.25901 0.272   0.7855  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]     1.146     0.8725    0.7230     1.817
Age                                                           1.035     0.9666    1.0074     1.062
Gendermale                                                    1.073     0.9319    0.6459     1.783

Concordance= 0.595  (se = 0.033 )
Likelihood ratio test= 6.98  on 3 df,   p=0.07
Wald test            = 6.75  on 3 df,   p=0.08
Score (logrank) test = 6.78  on 3 df,   p=0.08


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: 0.13635 
Standard error............: 0.235072 
Odds ratio (effect size)..: 1.146 
Lower 95% CI..............: 0.723 
Upper 95% CI..............: 1.817 
T-value...................: 0.580033 
P-value...................: 0.5618924 
Sample size in model......: 1187 
Number of events..........: 73 
* Analyzing the effect of plaque proteins on [epcoronary.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 522, number of events= 47 
   (1866 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 0.17371   1.18970  0.29265 0.594   0.5528  
Age                                                       0.03896   1.03973  0.01792 2.175   0.0297 *
Gendermale                                                1.01973   2.77244  0.43719 2.332   0.0197 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]     1.190     0.8405    0.6704     2.111
Age                                                           1.040     0.9618    1.0039     1.077
Gendermale                                                    2.772     0.3607    1.1769     6.531

Concordance= 0.646  (se = 0.038 )
Likelihood ratio test= 12.15  on 3 df,   p=0.007
Wald test            = 10.44  on 3 df,   p=0.02
Score (logrank) test = 10.96  on 3 df,   p=0.01


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6_rank 
Effect size...............: 0.173705 
Standard error............: 0.292653 
Odds ratio (effect size)..: 1.19 
Lower 95% CI..............: 0.67 
Upper 95% CI..............: 2.111 
T-value...................: 0.593554 
P-value...................: 0.5528105 
Sample size in model......: 522 
Number of events..........: 47 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 558, number of events= 47 
   (1830 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] 0.30417   1.35550  0.29625 1.027   0.3045  
Age                                                       0.03606   1.03672  0.01811 1.991   0.0464 *
Gendermale                                                0.79302   2.21007  0.41021 1.933   0.0532 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635]     1.356     0.7377    0.7585     2.423
Age                                                           1.037     0.9646    1.0006     1.074
Gendermale                                                    2.210     0.4525    0.9891     4.938

Concordance= 0.628  (se = 0.039 )
Likelihood ratio test= 9.85  on 3 df,   p=0.02
Wald test            = 8.75  on 3 df,   p=0.03
Score (logrank) test = 8.99  on 3 df,   p=0.03


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: MCP1_rank 
Effect size...............: 0.304172 
Standard error............: 0.296253 
Odds ratio (effect size)..: 1.356 
Lower 95% CI..............: 0.758 
Upper 95% CI..............: 2.423 
T-value...................: 1.026729 
P-value...................: 0.3045479 
Sample size in model......: 558 
Number of events..........: 47 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1141, number of events= 89 
   (1247 observations deleted due to missingness)

                                                               coef exp(coef)  se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] -0.079260  0.923800  0.212158 -0.374  0.70871   
Age                                                        0.005236  1.005250  0.011952  0.438  0.66131   
Gendermale                                                 0.776579  2.174022  0.283231  2.742  0.00611 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]    0.9238     1.0825    0.6095     1.400
Age                                                          1.0053     0.9948    0.9820     1.029
Gendermale                                                   2.1740     0.4600    1.2479     3.787

Concordance= 0.575  (se = 0.028 )
Likelihood ratio test= 9.22  on 3 df,   p=0.03
Wald test            = 7.88  on 3 df,   p=0.05
Score (logrank) test = 8.27  on 3 df,   p=0.04


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: -0.07926 
Standard error............: 0.212158 
Odds ratio (effect size)..: 0.924 
Lower 95% CI..............: 0.61 
Upper 95% CI..............: 1.4 
T-value...................: -0.373589 
P-value...................: 0.7087101 
Sample size in model......: 1141 
Number of events..........: 89 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1143, number of events= 90 
   (1245 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 0.382893  1.466522 0.214416 1.786   0.0741 .
Age                                                       0.007227  1.007253 0.011916 0.607   0.5442  
Gendermale                                                0.619255  1.857544 0.269355 2.299   0.0215 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]     1.467     0.6819    0.9633     2.233
Age                                                           1.007     0.9928    0.9840     1.031
Gendermale                                                    1.858     0.5383    1.0956     3.149

Concordance= 0.59  (se = 0.029 )
Likelihood ratio test= 9.52  on 3 df,   p=0.02
Wald test            = 8.77  on 3 df,   p=0.03
Score (logrank) test = 8.98  on 3 df,   p=0.03


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.382893 
Standard error............: 0.214416 
Odds ratio (effect size)..: 1.467 
Lower 95% CI..............: 0.963 
Upper 95% CI..............: 2.233 
T-value...................: 1.785754 
P-value...................: 0.0741391 
Sample size in model......: 1143 
Number of events..........: 90 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1187, number of events= 91 
   (1201 observations deleted due to missingness)

                                                               coef exp(coef)  se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] -0.172568  0.841501  0.210487 -0.820   0.4123  
Age                                                        0.006873  1.006897  0.011840  0.581   0.5616  
Gendermale                                                 0.671236  1.956655  0.269190  2.494   0.0126 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]    0.8415     1.1884    0.5570     1.271
Age                                                          1.0069     0.9932    0.9838     1.031
Gendermale                                                   1.9567     0.5111    1.1545     3.316

Concordance= 0.577  (se = 0.03 )
Likelihood ratio test= 7.99  on 3 df,   p=0.05
Wald test            = 7.11  on 3 df,   p=0.07
Score (logrank) test = 7.34  on 3 df,   p=0.06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: -0.172568 
Standard error............: 0.210487 
Odds ratio (effect size)..: 0.842 
Lower 95% CI..............: 0.557 
Upper 95% CI..............: 1.271 
T-value...................: -0.819853 
P-value...................: 0.4122998 
Sample size in model......: 1187 
Number of events..........: 91 
* Analyzing the effect of plaque proteins on [epcvdeath.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 522, number of events= 27 
   (1866 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 0.12032   1.12786  0.38592 0.312   0.7552  
Age                                                       0.05430   1.05581  0.02434 2.231   0.0257 *
Gendermale                                                0.82329   2.27798  0.54178 1.520   0.1286  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]     1.128     0.8866    0.5294     2.403
Age                                                           1.056     0.9471    1.0066     1.107
Gendermale                                                    2.278     0.4390    0.7877     6.587

Concordance= 0.665  (se = 0.059 )
Likelihood ratio test= 8.18  on 3 df,   p=0.04
Wald test            = 7.35  on 3 df,   p=0.06
Score (logrank) test = 7.53  on 3 df,   p=0.06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6_rank 
Effect size...............: 0.120318 
Standard error............: 0.385919 
Odds ratio (effect size)..: 1.128 
Lower 95% CI..............: 0.529 
Upper 95% CI..............: 2.403 
T-value...................: 0.311771 
P-value...................: 0.7552146 
Sample size in model......: 522 
Number of events..........: 27 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 558, number of events= 27 
   (1830 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -0.05233   0.94902  0.38729 -0.135   0.8925  
Age                                                        0.05687   1.05852  0.02468  2.304   0.0212 *
Gendermale                                                 0.79435   2.21300  0.54234  1.465   0.1430  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635]     0.949     1.0537    0.4442     2.027
Age                                                           1.059     0.9447    1.0085     1.111
Gendermale                                                    2.213     0.4519    0.7644     6.407

Concordance= 0.667  (se = 0.059 )
Likelihood ratio test= 8.48  on 3 df,   p=0.04
Wald test            = 7.69  on 3 df,   p=0.05
Score (logrank) test = 7.85  on 3 df,   p=0.05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.052326 
Standard error............: 0.387295 
Odds ratio (effect size)..: 0.949 
Lower 95% CI..............: 0.444 
Upper 95% CI..............: 2.027 
T-value...................: -0.135107 
P-value...................: 0.8925272 
Sample size in model......: 558 
Number of events..........: 27 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1141, number of events= 45 
   (1247 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] 0.10096   1.10623  0.29884 0.338   0.7355    
Age                                                       0.08294   1.08648  0.01919 4.322 1.55e-05 ***
Gendermale                                                0.89258   2.44141  0.41182 2.167   0.0302 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]     1.106     0.9040    0.6158     1.987
Age                                                           1.086     0.9204    1.0464     1.128
Gendermale                                                    2.441     0.4096    1.0892     5.472

Concordance= 0.706  (se = 0.037 )
Likelihood ratio test= 26.21  on 3 df,   p=9e-06
Wald test            = 22.65  on 3 df,   p=5e-05
Score (logrank) test = 23.27  on 3 df,   p=4e-05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: 0.100959 
Standard error............: 0.298838 
Odds ratio (effect size)..: 1.106 
Lower 95% CI..............: 0.616 
Upper 95% CI..............: 1.987 
T-value...................: 0.337838 
P-value...................: 0.7354853 
Sample size in model......: 1141 
Number of events..........: 45 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1143, number of events= 45 
   (1245 observations deleted due to missingness)

                                                             coef exp(coef) se(coef)     z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 0.77149   2.16299  0.31659 2.437   0.0148 *  
Age                                                       0.08479   1.08849  0.01926 4.403 1.07e-05 ***
Gendermale                                                0.87112   2.38958  0.41164 2.116   0.0343 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]     2.163     0.4623     1.163     4.023
Age                                                           1.088     0.9187     1.048     1.130
Gendermale                                                    2.390     0.4185     1.066     5.354

Concordance= 0.727  (se = 0.037 )
Likelihood ratio test= 31.83  on 3 df,   p=6e-07
Wald test            = 28.21  on 3 df,   p=3e-06
Score (logrank) test = 28.76  on 3 df,   p=3e-06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.77149 
Standard error............: 0.316594 
Odds ratio (effect size)..: 2.163 
Lower 95% CI..............: 1.163 
Upper 95% CI..............: 4.023 
T-value...................: 2.436846 
P-value...................: 0.01481598 
Sample size in model......: 1143 
Number of events..........: 45 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender, data = TEMP.DF)

  n= 1187, number of events= 45 
   (1201 observations deleted due to missingness)

                                                              coef exp(coef) se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] -0.11294   0.89320  0.29879 -0.378   0.7054    
Age                                                        0.08412   1.08776  0.01929  4.360  1.3e-05 ***
Gendermale                                                 0.90814   2.47970  0.41206  2.204   0.0275 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]    0.8932     1.1196    0.4973     1.604
Age                                                          1.0878     0.9193    1.0474     1.130
Gendermale                                                   2.4797     0.4033    1.1057     5.561

Concordance= 0.709  (se = 0.036 )
Likelihood ratio test= 26.75  on 3 df,   p=7e-06
Wald test            = 23.06  on 3 df,   p=4e-05
Score (logrank) test = 23.7  on 3 df,   p=3e-05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: -0.112944 
Standard error............: 0.298793 
Odds ratio (effect size)..: 0.893 
Lower 95% CI..............: 0.497 
Upper 95% CI..............: 1.604 
T-value...................: -0.378 
P-value...................: 0.7054304 
Sample size in model......: 1187 
Number of events..........: 45 

cat("- Edit the column names...\n")
- Edit the column names...
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
- Correct the variable types...
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
cat("- Writing results to Excel-file...\n")
- Writing results to Excel-file...
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL1.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
- Removing intermediate files...
#rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

#rm(head.style)

MODEL 2

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times)){
  eptime = times[i]
  ep = endpoints[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  #as.integer(TEMP.DF[,ep] == "Excluded")

  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [years]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 2 adjusted for age, sex, hypertension, diabetes, smoking, LDL-C levels, lipid-lowering drugs, antiplatelet drugs, eGFR, BMI, history of CVD, level of stenosis
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age + Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + CAD_history + Stroke_history + Peripheral.interv + stenose, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age + Gender + Hypertension.composite + DiabetesStatus + SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + CAD_history + Stroke_history + Peripheral.interv + stenose, data = TEMP.DF)

  
    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         # ylim = c(0.2, 1), xlim = c(0,3), col = c("#595A5C", "#DB003F", "#1290D9"),
         ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [years]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL2.pdf"), height = 12, width = 10, onefile = TRUE)

    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}
* Analyzing the effect of plaque proteins on [epmajor.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 477, number of events= 64 
   (1911 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]  1.309e-01  1.140e+00  2.580e-01  0.508  0.61176   
Age                                                        4.862e-02  1.050e+00  1.825e-02  2.664  0.00773 **
Gendermale                                                 6.880e-01  1.990e+00  3.396e-01  2.026  0.04279 * 
Hypertension.compositeno                                  -7.622e-01  4.666e-01  5.345e-01 -1.426  0.15387   
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA   
DiabetesStatusDiabetes                                     7.270e-01  2.069e+00  2.896e-01  2.510  0.01207 * 
SmokerCurrentno                                           -6.648e-01  5.144e-01  2.676e-01 -2.484  0.01298 * 
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA   
Med.Statin.LLDno                                           2.278e-01  1.256e+00  2.880e-01  0.791  0.42898   
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA   
Med.all.antiplateletno                                     1.425e-01  1.153e+00  4.189e-01  0.340  0.73377   
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA   
GFR_MDRD                                                  -4.913e-03  9.951e-01  6.711e-03 -0.732  0.46411   
BMI                                                        5.332e-04  1.001e+00  3.520e-02  0.015  0.98792   
CAD_history                                                5.932e-01  1.810e+00  2.727e-01  2.176  0.02959 * 
Stroke_history                                             1.930e-01  1.213e+00  2.673e-01  0.722  0.47032   
Peripheral.interv                                          6.059e-02  1.062e+00  3.164e-01  0.191  0.84814   
stenose0-49%                                              -1.611e+01  1.011e-07  3.372e+03 -0.005  0.99619   
stenose50-70%                                             -1.333e+00  2.637e-01  1.461e+00 -0.912  0.36164   
stenose70-90%                                             -4.726e-01  6.234e-01  1.061e+00 -0.445  0.65609   
stenose90-99%                                             -7.412e-01  4.765e-01  1.069e+00 -0.694  0.48795   
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA   
stenoseNA                                                         NA         NA  0.000e+00     NA       NA   
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA   
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA   
stenose99                                                         NA         NA  0.000e+00     NA       NA   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 1.140e+00  8.773e-01   0.68752    1.8899
Age                                                       1.050e+00  9.525e-01   1.01293    1.0881
Gendermale                                                1.990e+00  5.026e-01   1.02259    3.8717
Hypertension.compositeno                                  4.666e-01  2.143e+00   0.16368    1.3303
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    2.069e+00  4.834e-01   1.17271    3.6496
SmokerCurrentno                                           5.144e-01  1.944e+00   0.30442    0.8691
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.256e+00  7.963e-01   0.71413    2.2084
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.153e+00  8.672e-01   0.50733    2.6210
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.951e-01  1.005e+00   0.98210    1.0083
BMI                                                       1.001e+00  9.995e-01   0.93383    1.0720
CAD_history                                               1.810e+00  5.525e-01   1.06055    3.0885
Stroke_history                                            1.213e+00  8.245e-01   0.71822    2.0483
Peripheral.interv                                         1.062e+00  9.412e-01   0.57145    1.9754
stenose0-49%                                              1.011e-07  9.891e+06   0.00000       Inf
stenose50-70%                                             2.637e-01  3.792e+00   0.01505    4.6215
stenose70-90%                                             6.234e-01  1.604e+00   0.07787    4.9903
stenose90-99%                                             4.765e-01  2.098e+00   0.05868    3.8703
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.714  (se = 0.029 )
Likelihood ratio test= 37  on 17 df,   p=0.003
Wald test            = 33.02  on 17 df,   p=0.01
Score (logrank) test = 35.81  on 17 df,   p=0.005


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6_rank 
Effect size...............: 0.130932 
Standard error............: 0.257961 
Odds ratio (effect size)..: 1.14 
Lower 95% CI..............: 0.688 
Upper 95% CI..............: 1.89 
T-value...................: 0.507564 
P-value...................: 0.6117595 
Sample size in model......: 477 
Number of events..........: 64 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 509, number of events= 66 
   (1879 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -3.049e-01  7.372e-01  2.532e-01 -1.204   0.2287  
Age                                                        3.571e-02  1.036e+00  1.769e-02  2.019   0.0435 *
Gendermale                                                 7.112e-01  2.036e+00  3.367e-01  2.112   0.0347 *
Hypertension.compositeno                                  -8.086e-01  4.455e-01  5.335e-01 -1.516   0.1296  
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA  
DiabetesStatusDiabetes                                     6.394e-01  1.895e+00  2.842e-01  2.250   0.0244 *
SmokerCurrentno                                           -5.756e-01  5.624e-01  2.650e-01 -2.172   0.0299 *
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA  
Med.Statin.LLDno                                           2.742e-01  1.315e+00  2.847e-01  0.963   0.3356  
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA  
Med.all.antiplateletno                                     3.447e-03  1.003e+00  4.203e-01  0.008   0.9935  
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA  
GFR_MDRD                                                  -9.214e-03  9.908e-01  6.629e-03 -1.390   0.1646  
BMI                                                        1.203e-02  1.012e+00  3.398e-02  0.354   0.7234  
CAD_history                                                4.032e-01  1.497e+00  2.681e-01  1.504   0.1326  
Stroke_history                                             2.966e-01  1.345e+00  2.596e-01  1.142   0.2533  
Peripheral.interv                                          1.347e-01  1.144e+00  3.143e-01  0.429   0.6682  
stenose0-49%                                              -1.653e+01  6.613e-08  3.378e+03 -0.005   0.9961  
stenose50-70%                                             -1.817e+00  1.625e-01  1.455e+00 -1.249   0.2118  
stenose70-90%                                             -8.410e-01  4.313e-01  1.052e+00 -0.799   0.4240  
stenose90-99%                                             -1.061e+00  3.461e-01  1.061e+00 -1.000   0.3172  
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA  
stenoseNA                                                         NA         NA  0.000e+00     NA       NA  
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose99                                                         NA         NA  0.000e+00     NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] 7.372e-01  1.356e+00  0.448785    1.2111
Age                                                       1.036e+00  9.649e-01  1.001040    1.0729
Gendermale                                                2.036e+00  4.911e-01  1.052586    3.9395
Hypertension.compositeno                                  4.455e-01  2.245e+00  0.156588    1.2674
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.895e+00  5.276e-01  1.085923    3.3081
SmokerCurrentno                                           5.624e-01  1.778e+00  0.334542    0.9454
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.315e+00  7.602e-01  0.752853    2.2986
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.003e+00  9.966e-01  0.440301    2.2869
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.908e-01  1.009e+00  0.978038    1.0038
BMI                                                       1.012e+00  9.880e-01  0.946891    1.0818
CAD_history                                               1.497e+00  6.682e-01  0.884884    2.5311
Stroke_history                                            1.345e+00  7.434e-01  0.808757    2.2376
Peripheral.interv                                         1.144e+00  8.740e-01  0.617943    2.1187
stenose0-49%                                              6.613e-08  1.512e+07  0.000000       Inf
stenose50-70%                                             1.625e-01  6.155e+00  0.009373    2.8157
stenose70-90%                                             4.313e-01  2.319e+00  0.054876    3.3897
stenose90-99%                                             3.461e-01  2.889e+00  0.043283    2.7680
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.7  (se = 0.028 )
Likelihood ratio test= 35.01  on 17 df,   p=0.006
Wald test            = 31.02  on 17 df,   p=0.02
Score (logrank) test = 33.48  on 17 df,   p=0.01


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.304862 
Standard error............: 0.253245 
Odds ratio (effect size)..: 0.737 
Lower 95% CI..............: 0.449 
Upper 95% CI..............: 1.211 
T-value...................: -1.203825 
P-value...................: 0.2286573 
Sample size in model......: 509 
Number of events..........: 66 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1002, number of events= 114 
   (1386 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]  9.097e-02  1.095e+00  1.899e-01  0.479 0.631870    
Age                                                        3.856e-02  1.039e+00  1.296e-02  2.975 0.002927 ** 
Gendermale                                                 5.730e-01  1.774e+00  2.310e-01  2.481 0.013107 *  
Hypertension.compositeno                                  -5.174e-01  5.961e-01  3.773e-01 -1.371 0.170285    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -4.403e-02  9.569e-01  2.233e-01 -0.197 0.843644    
SmokerCurrentno                                           -6.023e-01  5.475e-01  2.046e-01 -2.944 0.003240 ** 
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           3.369e-01  1.401e+00  2.175e-01  1.549 0.121332    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     4.026e-01  1.496e+00  2.586e-01  1.557 0.119528    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -1.899e-02  9.812e-01  4.977e-03 -3.815 0.000136 ***
BMI                                                        5.747e-02  1.059e+00  2.597e-02  2.213 0.026905 *  
CAD_history                                                1.411e-01  1.152e+00  2.032e-01  0.695 0.487257    
Stroke_history                                             4.304e-02  1.044e+00  2.028e-01  0.212 0.831900    
Peripheral.interv                                          6.318e-01  1.881e+00  2.183e-01  2.894 0.003802 ** 
stenose0-49%                                              -1.561e+01  1.659e-07  2.745e+03 -0.006 0.995462    
stenose50-70%                                             -8.519e-01  4.266e-01  8.692e-01 -0.980 0.326998    
stenose70-90%                                             -2.953e-01  7.443e-01  7.264e-01 -0.406 0.684395    
stenose90-99%                                             -2.722e-01  7.617e-01  7.236e-01 -0.376 0.706782    
stenose100% (Occlusion)                                    4.662e-02  1.048e+00  1.239e+00  0.038 0.969996    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.539e+01  2.069e-07  4.208e+03 -0.004 0.997082    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] 1.095e+00  9.130e-01   0.75490    1.5890
Age                                                       1.039e+00  9.622e-01   1.01325    1.0660
Gendermale                                                1.774e+00  5.638e-01   1.12785    2.7890
Hypertension.compositeno                                  5.961e-01  1.678e+00   0.28453    1.2487
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.569e-01  1.045e+00   0.61778    1.4822
SmokerCurrentno                                           5.475e-01  1.826e+00   0.36664    0.8176
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.401e+00  7.140e-01   0.91454    2.1451
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.496e+00  6.686e-01   0.90098    2.4831
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.812e-01  1.019e+00   0.97167    0.9908
BMI                                                       1.059e+00  9.442e-01   1.00659    1.1145
CAD_history                                               1.152e+00  8.684e-01   0.77330    1.7150
Stroke_history                                            1.044e+00  9.579e-01   0.70161    1.5534
Peripheral.interv                                         1.881e+00  5.316e-01   1.22621    2.8853
stenose0-49%                                              1.659e-07  6.027e+06   0.00000       Inf
stenose50-70%                                             4.266e-01  2.344e+00   0.07765    2.3434
stenose70-90%                                             7.443e-01  1.343e+00   0.17924    3.0909
stenose90-99%                                             7.617e-01  1.313e+00   0.18446    3.1454
stenose100% (Occlusion)                                   1.048e+00  9.545e-01   0.09231   11.8918
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.069e-07  4.833e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.705  (se = 0.023 )
Likelihood ratio test= 68.36  on 19 df,   p=2e-07
Wald test            = 38.72  on 19 df,   p=0.005
Score (logrank) test = 66.86  on 19 df,   p=3e-07


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: 0.090966 
Standard error............: 0.189871 
Odds ratio (effect size)..: 1.095 
Lower 95% CI..............: 0.755 
Upper 95% CI..............: 1.589 
T-value...................: 0.479096 
P-value...................: 0.6318701 
Sample size in model......: 1002 
Number of events..........: 114 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1006, number of events= 119 
   (1382 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]  3.149e-01  1.370e+00  1.929e-01  1.633 0.102540    
Age                                                        3.419e-02  1.035e+00  1.261e-02  2.711 0.006713 ** 
Gendermale                                                 4.342e-01  1.544e+00  2.199e-01  1.974 0.048335 *  
Hypertension.compositeno                                  -4.432e-01  6.420e-01  3.576e-01 -1.239 0.215200    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -5.992e-02  9.418e-01  2.208e-01 -0.271 0.786088    
SmokerCurrentno                                           -5.022e-01  6.052e-01  2.014e-01 -2.493 0.012653 *  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           2.893e-01  1.336e+00  2.159e-01  1.340 0.180144    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     3.779e-01  1.459e+00  2.578e-01  1.466 0.142612    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -1.788e-02  9.823e-01  4.918e-03 -3.635 0.000278 ***
BMI                                                        5.699e-02  1.059e+00  2.656e-02  2.146 0.031874 *  
CAD_history                                                1.903e-01  1.210e+00  1.989e-01  0.956 0.338836    
Stroke_history                                             3.055e-02  1.031e+00  1.974e-01  0.155 0.876999    
Peripheral.interv                                          5.619e-01  1.754e+00  2.131e-01  2.637 0.008368 ** 
stenose0-49%                                              -1.540e+01  2.045e-07  3.123e+03 -0.005 0.996065    
stenose50-70%                                             -8.794e-01  4.150e-01  8.686e-01 -1.012 0.311330    
stenose70-90%                                             -3.666e-01  6.931e-01  7.269e-01 -0.504 0.613981    
stenose90-99%                                             -3.659e-01  6.936e-01  7.256e-01 -0.504 0.614096    
stenose100% (Occlusion)                                   -5.671e-02  9.449e-01  1.238e+00 -0.046 0.963452    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.519e+01  2.528e-07  2.805e+03 -0.005 0.995679    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 1.370e+00  7.299e-01   0.93882    1.9996
Age                                                       1.035e+00  9.664e-01   1.00951    1.0607
Gendermale                                                1.544e+00  6.478e-01   1.00318    2.3753
Hypertension.compositeno                                  6.420e-01  1.558e+00   0.31849    1.2939
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.418e-01  1.062e+00   0.61101    1.4518
SmokerCurrentno                                           6.052e-01  1.652e+00   0.40784    0.8981
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.336e+00  7.488e-01   0.87479    2.0390
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.459e+00  6.853e-01   0.88047    2.4185
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.823e-01  1.018e+00   0.97286    0.9918
BMI                                                       1.059e+00  9.446e-01   1.00495    1.1152
CAD_history                                               1.210e+00  8.267e-01   0.81904    1.7863
Stroke_history                                            1.031e+00  9.699e-01   0.70028    1.5180
Peripheral.interv                                         1.754e+00  5.701e-01   1.15517    2.6634
stenose0-49%                                              2.045e-07  4.889e+06   0.00000       Inf
stenose50-70%                                             4.150e-01  2.409e+00   0.07564    2.2773
stenose70-90%                                             6.931e-01  1.443e+00   0.16675    2.8806
stenose90-99%                                             6.936e-01  1.442e+00   0.16730    2.8756
stenose100% (Occlusion)                                   9.449e-01  1.058e+00   0.08354   10.6868
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.528e-07  3.956e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.694  (se = 0.023 )
Likelihood ratio test= 64.3  on 19 df,   p=8e-07
Wald test            = 60.58  on 19 df,   p=3e-06
Score (logrank) test = 64.14  on 19 df,   p=8e-07


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.314907 
Standard error............: 0.19288 
Odds ratio (effect size)..: 1.37 
Lower 95% CI..............: 0.939 
Upper 95% CI..............: 2 
T-value...................: 1.632661 
P-value...................: 0.1025404 
Sample size in model......: 1006 
Number of events..........: 119 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1044, number of events= 120 
   (1344 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]  1.748e-01  1.191e+00  1.860e-01  0.940  0.34727    
Age                                                        3.379e-02  1.034e+00  1.249e-02  2.704  0.00684 ** 
Gendermale                                                 4.474e-01  1.564e+00  2.179e-01  2.053  0.04006 *  
Hypertension.compositeno                                  -4.648e-01  6.283e-01  3.578e-01 -1.299  0.19387    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -4.790e-02  9.532e-01  2.188e-01 -0.219  0.82676    
SmokerCurrentno                                           -5.109e-01  6.000e-01  2.003e-01 -2.550  0.01076 *  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           3.401e-01  1.405e+00  2.130e-01  1.597  0.11036    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     3.623e-01  1.437e+00  2.571e-01  1.409  0.15872    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -1.979e-02  9.804e-01  4.879e-03 -4.056 4.99e-05 ***
BMI                                                        5.687e-02  1.059e+00  2.555e-02  2.226  0.02603 *  
CAD_history                                                1.679e-01  1.183e+00  1.979e-01  0.848  0.39636    
Stroke_history                                             3.892e-02  1.040e+00  1.978e-01  0.197  0.84402    
Peripheral.interv                                          5.626e-01  1.755e+00  2.131e-01  2.641  0.00827 ** 
stenose0-49%                                              -1.548e+01  1.894e-07  2.739e+03 -0.006  0.99549    
stenose50-70%                                             -8.329e-01  4.348e-01  8.698e-01 -0.958  0.33825    
stenose70-90%                                             -2.432e-01  7.841e-01  7.270e-01 -0.334  0.73803    
stenose90-99%                                             -1.974e-01  8.209e-01  7.252e-01 -0.272  0.78546    
stenose100% (Occlusion)                                    1.205e-01  1.128e+00  1.242e+00  0.097  0.92272    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.518e+01  2.560e-07  2.870e+03 -0.005  0.99578    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 1.191e+00  8.396e-01   0.82721    1.7148
Age                                                       1.034e+00  9.668e-01   1.00934    1.0600
Gendermale                                                1.564e+00  6.393e-01   1.02051    2.3975
Hypertension.compositeno                                  6.283e-01  1.592e+00   0.31162    1.2667
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.532e-01  1.049e+00   0.62075    1.4638
SmokerCurrentno                                           6.000e-01  1.667e+00   0.40514    0.8884
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.405e+00  7.117e-01   0.92552    2.1331
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.437e+00  6.961e-01   0.86802    2.3778
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.804e-01  1.020e+00   0.97107    0.9898
BMI                                                       1.059e+00  9.447e-01   1.00681    1.1129
CAD_history                                               1.183e+00  8.455e-01   0.80247    1.7433
Stroke_history                                            1.040e+00  9.618e-01   0.70553    1.5321
Peripheral.interv                                         1.755e+00  5.697e-01   1.15608    2.6651
stenose0-49%                                              1.894e-07  5.281e+06   0.00000       Inf
stenose50-70%                                             4.348e-01  2.300e+00   0.07905    2.3912
stenose70-90%                                             7.841e-01  1.275e+00   0.18860    3.2602
stenose90-99%                                             8.209e-01  1.218e+00   0.19814    3.4007
stenose100% (Occlusion)                                   1.128e+00  8.865e-01   0.09893   12.8612
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.560e-07  3.906e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.696  (se = 0.023 )
Likelihood ratio test= 65.33  on 19 df,   p=5e-07
Wald test            = 60.85  on 19 df,   p=3e-06
Score (logrank) test = 63.96  on 19 df,   p=9e-07


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epmajor.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epmajor.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: 0.174792 
Standard error............: 0.185968 
Odds ratio (effect size)..: 1.191 
Lower 95% CI..............: 0.827 
Upper 95% CI..............: 1.715 
T-value...................: 0.939904 
P-value...................: 0.3472667 
Sample size in model......: 1044 
Number of events..........: 120 
* Analyzing the effect of plaque proteins on [epstroke.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 477, number of events= 32 
   (1911 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]  2.472e-02  1.025e+00  3.648e-01  0.068    0.946
Age                                                        3.546e-02  1.036e+00  2.467e-02  1.438    0.151
Gendermale                                                 3.450e-02  1.035e+00  4.022e-01  0.086    0.932
Hypertension.compositeno                                  -7.437e-01  4.754e-01  7.516e-01 -0.990    0.322
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA
DiabetesStatusDiabetes                                     5.315e-01  1.701e+00  4.207e-01  1.263    0.206
SmokerCurrentno                                           -5.350e-01  5.857e-01  3.815e-01 -1.402    0.161
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA
Med.Statin.LLDno                                          -2.487e-02  9.754e-01  4.179e-01 -0.060    0.953
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA
Med.all.antiplateletno                                     3.103e-01  1.364e+00  5.848e-01  0.531    0.596
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA
GFR_MDRD                                                  -8.165e-04  9.992e-01  9.773e-03 -0.084    0.933
BMI                                                       -1.288e-02  9.872e-01  4.814e-02 -0.268    0.789
CAD_history                                                2.559e-01  1.292e+00  3.977e-01  0.643    0.520
Stroke_history                                             3.207e-01  1.378e+00  3.689e-01  0.869    0.385
Peripheral.interv                                         -5.758e-01  5.622e-01  5.473e-01 -1.052    0.293
stenose0-49%                                              -1.810e+01  1.377e-08  1.222e+04 -0.001    0.999
stenose50-70%                                             -1.785e+01  1.766e-08  4.805e+03 -0.004    0.997
stenose70-90%                                             -8.478e-01  4.283e-01  1.142e+00 -0.742    0.458
stenose90-99%                                             -9.721e-01  3.783e-01  1.153e+00 -0.843    0.399
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA
stenoseNA                                                         NA         NA  0.000e+00     NA       NA
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA
stenose99                                                         NA         NA  0.000e+00     NA       NA

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 1.025e+00  9.756e-01   0.50142     2.095
Age                                                       1.036e+00  9.652e-01   0.98720     1.087
Gendermale                                                1.035e+00  9.661e-01   0.47054     2.277
Hypertension.compositeno                                  4.754e-01  2.104e+00   0.10897     2.074
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.701e+00  5.877e-01   0.74601     3.881
SmokerCurrentno                                           5.857e-01  1.708e+00   0.27727     1.237
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          9.754e-01  1.025e+00   0.43002     2.213
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.364e+00  7.332e-01   0.43347     4.291
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.992e-01  1.001e+00   0.98023     1.019
BMI                                                       9.872e-01  1.013e+00   0.89831     1.085
CAD_history                                               1.292e+00  7.742e-01   0.59235     2.816
Stroke_history                                            1.378e+00  7.256e-01   0.66875     2.840
Peripheral.interv                                         5.622e-01  1.779e+00   0.19233     1.644
stenose0-49%                                              1.377e-08  7.260e+07   0.00000       Inf
stenose50-70%                                             1.766e-08  5.662e+07   0.00000       Inf
stenose70-90%                                             4.283e-01  2.335e+00   0.04564     4.020
stenose90-99%                                             3.783e-01  2.643e+00   0.03946     3.627
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.712  (se = 0.04 )
Likelihood ratio test= 13.18  on 17 df,   p=0.7
Wald test            = 9.66  on 17 df,   p=0.9
Score (logrank) test = 11.9  on 17 df,   p=0.8


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6_rank 
Effect size...............: 0.024717 
Standard error............: 0.364815 
Odds ratio (effect size)..: 1.025 
Lower 95% CI..............: 0.501 
Upper 95% CI..............: 2.095 
T-value...................: 0.067752 
P-value...................: 0.9459834 
Sample size in model......: 477 
Number of events..........: 32 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 509, number of events= 33 
   (1879 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -4.721e-01  6.237e-01  3.625e-01 -1.302    0.193
Age                                                        2.320e-02  1.023e+00  2.358e-02  0.984    0.325
Gendermale                                                 6.449e-02  1.067e+00  3.990e-01  0.162    0.872
Hypertension.compositeno                                  -8.685e-01  4.196e-01  7.492e-01 -1.159    0.246
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA
DiabetesStatusDiabetes                                     3.761e-01  1.457e+00  4.161e-01  0.904    0.366
SmokerCurrentno                                           -4.557e-01  6.340e-01  3.760e-01 -1.212    0.226
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA
Med.Statin.LLDno                                           4.243e-02  1.043e+00  4.107e-01  0.103    0.918
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA
Med.all.antiplateletno                                     1.006e-01  1.106e+00  5.873e-01  0.171    0.864
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA
GFR_MDRD                                                   1.256e-03  1.001e+00  9.624e-03  0.130    0.896
BMI                                                        1.816e-02  1.018e+00  4.546e-02  0.399    0.690
CAD_history                                                7.676e-02  1.080e+00  3.981e-01  0.193    0.847
Stroke_history                                             4.080e-01  1.504e+00  3.637e-01  1.122    0.262
Peripheral.interv                                         -4.789e-01  6.195e-01  5.459e-01 -0.877    0.380
stenose0-49%                                              -1.860e+01  8.342e-09  1.262e+04 -0.001    0.999
stenose50-70%                                             -1.841e+01  1.006e-08  4.635e+03 -0.004    0.997
stenose70-90%                                             -1.288e+00  2.757e-01  1.118e+00 -1.153    0.249
stenose90-99%                                             -1.414e+00  2.433e-01  1.134e+00 -1.246    0.213
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA
stenoseNA                                                         NA         NA  0.000e+00     NA       NA
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA
stenose99                                                         NA         NA  0.000e+00     NA       NA

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] 6.237e-01  1.603e+00   0.30651     1.269
Age                                                       1.023e+00  9.771e-01   0.97724     1.072
Gendermale                                                1.067e+00  9.375e-01   0.48793     2.332
Hypertension.compositeno                                  4.196e-01  2.383e+00   0.09662     1.822
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.457e+00  6.865e-01   0.64443     3.292
SmokerCurrentno                                           6.340e-01  1.577e+00   0.30344     1.325
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.043e+00  9.585e-01   0.46651     2.333
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.106e+00  9.043e-01   0.34980     3.496
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  1.001e+00  9.987e-01   0.98255     1.020
BMI                                                       1.018e+00  9.820e-01   0.93151     1.113
CAD_history                                               1.080e+00  9.261e-01   0.49485     2.356
Stroke_history                                            1.504e+00  6.650e-01   0.73718     3.068
Peripheral.interv                                         6.195e-01  1.614e+00   0.21250     1.806
stenose0-49%                                              8.342e-09  1.199e+08   0.00000       Inf
stenose50-70%                                             1.006e-08  9.940e+07   0.00000       Inf
stenose70-90%                                             2.757e-01  3.627e+00   0.03082     2.466
stenose90-99%                                             2.433e-01  4.110e+00   0.02633     2.248
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.687  (se = 0.042 )
Likelihood ratio test= 13.23  on 17 df,   p=0.7
Wald test            = 10.29  on 17 df,   p=0.9
Score (logrank) test = 12.25  on 17 df,   p=0.8


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.472091 
Standard error............: 0.36246 
Odds ratio (effect size)..: 0.624 
Lower 95% CI..............: 0.307 
Upper 95% CI..............: 1.269 
T-value...................: -1.302464 
P-value...................: 0.1927578 
Sample size in model......: 509 
Number of events..........: 33 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1002, number of events= 58 
   (1386 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] -1.438e-01  8.660e-01  2.656e-01 -0.541  0.58818   
Age                                                        5.026e-02  1.052e+00  1.793e-02  2.803  0.00506 **
Gendermale                                                 2.919e-01  1.339e+00  3.000e-01  0.973  0.33043   
Hypertension.compositeno                                  -2.080e-01  8.122e-01  4.442e-01 -0.468  0.63956   
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA   
DiabetesStatusDiabetes                                    -6.073e-02  9.411e-01  3.197e-01 -0.190  0.84935   
SmokerCurrentno                                           -3.427e-01  7.098e-01  2.939e-01 -1.166  0.24358   
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA   
Med.Statin.LLDno                                           3.978e-01  1.488e+00  2.912e-01  1.366  0.17192   
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA   
Med.all.antiplateletno                                     3.468e-01  1.414e+00  3.748e-01  0.925  0.35485   
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA   
GFR_MDRD                                                  -5.639e-03  9.944e-01  7.004e-03 -0.805  0.42078   
BMI                                                        9.236e-02  1.097e+00  3.357e-02  2.751  0.00593 **
CAD_history                                               -5.750e-01  5.627e-01  3.288e-01 -1.749  0.08031 . 
Stroke_history                                             3.241e-01  1.383e+00  2.748e-01  1.179  0.23826   
Peripheral.interv                                          4.887e-01  1.630e+00  3.276e-01  1.492  0.13578   
stenose0-49%                                              -1.559e+01  1.699e-07  3.740e+03 -0.004  0.99667   
stenose50-70%                                             -5.898e-01  5.544e-01  1.159e+00 -0.509  0.61097   
stenose70-90%                                             -3.521e-01  7.032e-01  1.025e+00 -0.343  0.73127   
stenose90-99%                                             -3.578e-01  6.992e-01  1.024e+00 -0.349  0.72672   
stenose100% (Occlusion)                                    3.875e-01  1.473e+00  1.439e+00  0.269  0.78767   
stenoseNA                                                         NA         NA  0.000e+00     NA       NA   
stenose50-99%                                             -1.537e+01  2.109e-07  5.615e+03 -0.003  0.99782   
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA   
stenose99                                                         NA         NA  0.000e+00     NA       NA   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] 8.660e-01  1.155e+00   0.51454     1.458
Age                                                       1.052e+00  9.510e-01   1.01523     1.089
Gendermale                                                1.339e+00  7.468e-01   0.74380     2.411
Hypertension.compositeno                                  8.122e-01  1.231e+00   0.34009     1.940
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.411e-01  1.063e+00   0.50289     1.761
SmokerCurrentno                                           7.098e-01  1.409e+00   0.39898     1.263
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.488e+00  6.718e-01   0.84120     2.634
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.414e+00  7.070e-01   0.67854     2.949
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.944e-01  1.006e+00   0.98082     1.008
BMI                                                       1.097e+00  9.118e-01   1.02692     1.171
CAD_history                                               5.627e-01  1.777e+00   0.29542     1.072
Stroke_history                                            1.383e+00  7.232e-01   0.80691     2.370
Peripheral.interv                                         1.630e+00  6.134e-01   0.85779     3.098
stenose0-49%                                              1.699e-07  5.887e+06   0.00000       Inf
stenose50-70%                                             5.544e-01  1.804e+00   0.05713     5.380
stenose70-90%                                             7.032e-01  1.422e+00   0.09429     5.245
stenose90-99%                                             6.992e-01  1.430e+00   0.09401     5.200
stenose100% (Occlusion)                                   1.473e+00  6.788e-01   0.08784    24.711
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.109e-07  4.742e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.682  (se = 0.036 )
Likelihood ratio test= 27.19  on 19 df,   p=0.1
Wald test            = 22.76  on 19 df,   p=0.2
Score (logrank) test = 26.28  on 19 df,   p=0.1


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: -0.143835 
Standard error............: 0.265636 
Odds ratio (effect size)..: 0.866 
Lower 95% CI..............: 0.515 
Upper 95% CI..............: 1.458 
T-value...................: -0.541475 
P-value...................: 0.5881802 
Sample size in model......: 1002 
Number of events..........: 58 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1006, number of events= 61 
   (1382 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]  9.097e-02  1.095e+00  2.649e-01  0.343  0.73127   
Age                                                        4.173e-02  1.043e+00  1.733e-02  2.408  0.01603 * 
Gendermale                                                 2.095e-01  1.233e+00  2.916e-01  0.719  0.47243   
Hypertension.compositeno                                  -1.100e-01  8.958e-01  4.146e-01 -0.265  0.79079   
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA   
DiabetesStatusDiabetes                                    -9.138e-02  9.127e-01  3.159e-01 -0.289  0.77242   
SmokerCurrentno                                           -1.889e-01  8.279e-01  2.901e-01 -0.651  0.51499   
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA   
Med.Statin.LLDno                                           4.222e-01  1.525e+00  2.868e-01  1.472  0.14104   
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA   
Med.all.antiplateletno                                     3.050e-01  1.357e+00  3.718e-01  0.820  0.41197   
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA   
GFR_MDRD                                                  -3.051e-03  9.970e-01  7.024e-03 -0.434  0.66402   
BMI                                                        9.994e-02  1.105e+00  3.516e-02  2.842  0.00448 **
CAD_history                                               -4.477e-01  6.391e-01  3.134e-01 -1.429  0.15306   
Stroke_history                                             3.724e-01  1.451e+00  2.649e-01  1.406  0.15973   
Peripheral.interv                                          5.374e-01  1.712e+00  3.163e-01  1.699  0.08937 . 
stenose0-49%                                              -1.514e+01  2.649e-07  4.536e+03 -0.003  0.99734   
stenose50-70%                                             -6.162e-01  5.400e-01  1.159e+00 -0.532  0.59478   
stenose70-90%                                             -3.140e-01  7.305e-01  1.023e+00 -0.307  0.75884   
stenose90-99%                                             -4.118e-01  6.625e-01  1.025e+00 -0.402  0.68783   
stenose100% (Occlusion)                                    3.763e-01  1.457e+00  1.435e+00  0.262  0.79312   
stenoseNA                                                         NA         NA  0.000e+00     NA       NA   
stenose50-99%                                             -1.530e+01  2.262e-07  3.904e+03 -0.004  0.99687   
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA   
stenose99                                                         NA         NA  0.000e+00     NA       NA   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 1.095e+00  9.130e-01   0.65167     1.841
Age                                                       1.043e+00  9.591e-01   1.00780     1.079
Gendermale                                                1.233e+00  8.110e-01   0.69627     2.184
Hypertension.compositeno                                  8.958e-01  1.116e+00   0.39748     2.019
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.127e-01  1.096e+00   0.49134     1.695
SmokerCurrentno                                           8.279e-01  1.208e+00   0.46886     1.462
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.525e+00  6.556e-01   0.86938     2.676
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.357e+00  7.371e-01   0.65464     2.812
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.970e-01  1.003e+00   0.98332     1.011
BMI                                                       1.105e+00  9.049e-01   1.03152     1.184
CAD_history                                               6.391e-01  1.565e+00   0.34580     1.181
Stroke_history                                            1.451e+00  6.891e-01   0.86351     2.439
Peripheral.interv                                         1.712e+00  5.843e-01   0.92068     3.182
stenose0-49%                                              2.649e-07  3.775e+06   0.00000       Inf
stenose50-70%                                             5.400e-01  1.852e+00   0.05575     5.230
stenose70-90%                                             7.305e-01  1.369e+00   0.09839     5.424
stenose90-99%                                             6.625e-01  1.510e+00   0.08888     4.938
stenose100% (Occlusion)                                   1.457e+00  6.864e-01   0.08754    24.245
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.262e-07  4.421e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.669  (se = 0.037 )
Likelihood ratio test= 24.74  on 19 df,   p=0.2
Wald test            = 22.97  on 19 df,   p=0.2
Score (logrank) test = 24.39  on 19 df,   p=0.2


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.090975 
Standard error............: 0.264899 
Odds ratio (effect size)..: 1.095 
Lower 95% CI..............: 0.652 
Upper 95% CI..............: 1.841 
T-value...................: 0.343431 
P-value...................: 0.731274 
Sample size in model......: 1006 
Number of events..........: 61 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1044, number of events= 62 
   (1344 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)   
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148]  1.163e-01  1.123e+00  2.615e-01  0.445   0.6566   
Age                                                        4.236e-02  1.043e+00  1.715e-02  2.470   0.0135 * 
Gendermale                                                 2.109e-01  1.235e+00  2.871e-01  0.734   0.4627   
Hypertension.compositeno                                  -1.076e-01  8.980e-01  4.149e-01 -0.259   0.7954   
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA   
DiabetesStatusDiabetes                                    -4.084e-02  9.600e-01  3.103e-01 -0.132   0.8953   
SmokerCurrentno                                           -1.804e-01  8.349e-01  2.888e-01 -0.625   0.5322   
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA   
Med.Statin.LLDno                                           4.214e-01  1.524e+00  2.823e-01  1.493   0.1355   
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA   
Med.all.antiplateletno                                     2.868e-01  1.332e+00  3.711e-01  0.773   0.4396   
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA   
GFR_MDRD                                                  -5.616e-03  9.944e-01  6.832e-03 -0.822   0.4111   
BMI                                                        9.215e-02  1.097e+00  3.244e-02  2.841   0.0045 **
CAD_history                                               -4.624e-01  6.298e-01  3.106e-01 -1.489   0.1366   
Stroke_history                                             3.497e-01  1.419e+00  2.651e-01  1.319   0.1871   
Peripheral.interv                                          4.865e-01  1.627e+00  3.152e-01  1.544   0.1227   
stenose0-49%                                              -1.547e+01  1.920e-07  3.676e+03 -0.004   0.9966   
stenose50-70%                                             -5.939e-01  5.522e-01  1.159e+00 -0.512   0.6085   
stenose70-90%                                             -2.858e-01  7.514e-01  1.025e+00 -0.279   0.7803   
stenose90-99%                                             -3.216e-01  7.250e-01  1.026e+00 -0.313   0.7541   
stenose100% (Occlusion)                                    4.722e-01  1.604e+00  1.441e+00  0.328   0.7431   
stenoseNA                                                         NA         NA  0.000e+00     NA       NA   
stenose50-99%                                             -1.528e+01  2.307e-07  3.934e+03 -0.004   0.9969   
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA   
stenose99                                                         NA         NA  0.000e+00     NA       NA   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 1.123e+00  8.902e-01   0.67282     1.875
Age                                                       1.043e+00  9.585e-01   1.00878     1.079
Gendermale                                                1.235e+00  8.099e-01   0.70336     2.168
Hypertension.compositeno                                  8.980e-01  1.114e+00   0.39817     2.025
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.600e-01  1.042e+00   0.52254     1.764
SmokerCurrentno                                           8.349e-01  1.198e+00   0.47408     1.471
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.524e+00  6.562e-01   0.87646     2.650
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.332e+00  7.507e-01   0.64369     2.757
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.944e-01  1.006e+00   0.98117     1.008
BMI                                                       1.097e+00  9.120e-01   1.02898     1.169
CAD_history                                               6.298e-01  1.588e+00   0.34258     1.158
Stroke_history                                            1.419e+00  7.049e-01   0.84381     2.385
Peripheral.interv                                         1.627e+00  6.148e-01   0.87701     3.017
stenose0-49%                                              1.920e-07  5.208e+06   0.00000       Inf
stenose50-70%                                             5.522e-01  1.811e+00   0.05691     5.358
stenose70-90%                                             7.514e-01  1.331e+00   0.10089     5.597
stenose90-99%                                             7.250e-01  1.379e+00   0.09697     5.421
stenose100% (Occlusion)                                   1.604e+00  6.236e-01   0.09522    27.006
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.307e-07  4.335e+06   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.672  (se = 0.036 )
Likelihood ratio test= 25.52  on 19 df,   p=0.1
Wald test            = 23.76  on 19 df,   p=0.2
Score (logrank) test = 25.03  on 19 df,   p=0.2


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epstroke.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epstroke.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: 0.116261 
Standard error............: 0.261501 
Odds ratio (effect size)..: 1.123 
Lower 95% CI..............: 0.673 
Upper 95% CI..............: 1.875 
T-value...................: 0.444593 
P-value...................: 0.6566139 
Sample size in model......: 1044 
Number of events..........: 62 
* Analyzing the effect of plaque proteins on [epcoronary.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 477, number of events= 43 
   (1911 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694]  1.378e-01  1.148e+00  3.168e-01  0.435   0.6635  
Age                                                        4.680e-02  1.048e+00  2.288e-02  2.046   0.0408 *
Gendermale                                                 8.433e-01  2.324e+00  4.519e-01  1.866   0.0620 .
Hypertension.compositeno                                  -5.478e-01  5.782e-01  6.192e-01 -0.885   0.3763  
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA  
DiabetesStatusDiabetes                                     4.049e-01  1.499e+00  3.626e-01  1.117   0.2642  
SmokerCurrentno                                           -4.949e-01  6.097e-01  3.286e-01 -1.506   0.1321  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA  
Med.Statin.LLDno                                           9.778e-02  1.103e+00  3.667e-01  0.267   0.7897  
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA  
Med.all.antiplateletno                                     3.919e-01  1.480e+00  4.544e-01  0.862   0.3885  
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA  
GFR_MDRD                                                  -7.231e-03  9.928e-01  8.598e-03 -0.841   0.4004  
BMI                                                        1.272e-02  1.013e+00  4.331e-02  0.294   0.7691  
CAD_history                                                7.817e-01  2.185e+00  3.375e-01  2.316   0.0205 *
Stroke_history                                            -2.712e-01  7.624e-01  3.572e-01 -0.759   0.4477  
Peripheral.interv                                          3.803e-01  1.463e+00  3.575e-01  1.064   0.2874  
stenose0-49%                                              -8.465e-01  4.289e-01  8.354e+03  0.000   0.9999  
stenose50-70%                                              1.550e+01  5.402e+06  4.119e+03  0.004   0.9970  
stenose70-90%                                              1.589e+01  7.997e+06  4.119e+03  0.004   0.9969  
stenose90-99%                                              1.577e+01  7.055e+06  4.119e+03  0.004   0.9969  
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA  
stenoseNA                                                         NA         NA  0.000e+00     NA       NA  
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose99                                                         NA         NA  0.000e+00     NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 1.148e+00  8.713e-01    0.6169     2.135
Age                                                       1.048e+00  9.543e-01    1.0020     1.096
Gendermale                                                2.324e+00  4.303e-01    0.9584     5.635
Hypertension.compositeno                                  5.782e-01  1.729e+00    0.1718     1.946
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.499e+00  6.671e-01    0.7365     3.051
SmokerCurrentno                                           6.097e-01  1.640e+00    0.3201     1.161
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.103e+00  9.068e-01    0.5375     2.262
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.480e+00  6.758e-01    0.6073     3.605
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.928e-01  1.007e+00    0.9762     1.010
BMI                                                       1.013e+00  9.874e-01    0.9304     1.103
CAD_history                                               2.185e+00  4.576e-01    1.1278     4.234
Stroke_history                                            7.624e-01  1.312e+00    0.3786     1.536
Peripheral.interv                                         1.463e+00  6.837e-01    0.7259     2.947
stenose0-49%                                              4.289e-01  2.332e+00    0.0000       Inf
stenose50-70%                                             5.402e+06  1.851e-07    0.0000       Inf
stenose70-90%                                             7.997e+06  1.251e-07    0.0000       Inf
stenose90-99%                                             7.055e+06  1.417e-07    0.0000       Inf
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.749  (se = 0.033 )
Likelihood ratio test= 31.57  on 17 df,   p=0.02
Wald test            = 24.09  on 17 df,   p=0.1
Score (logrank) test = 32.09  on 17 df,   p=0.01


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6_rank 
Effect size...............: 0.137818 
Standard error............: 0.316752 
Odds ratio (effect size)..: 1.148 
Lower 95% CI..............: 0.617 
Upper 95% CI..............: 2.135 
T-value...................: 0.435097 
P-value...................: 0.6634919 
Sample size in model......: 477 
Number of events..........: 43 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 509, number of events= 44 
   (1879 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635]  2.557e-01  1.291e+00  3.158e-01  0.810   0.4182  
Age                                                        3.929e-02  1.040e+00  2.294e-02  1.713   0.0868 .
Gendermale                                                 6.478e-01  1.911e+00  4.234e-01  1.530   0.1260  
Hypertension.compositeno                                  -2.496e-01  7.791e-01  5.535e-01 -0.451   0.6520  
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA  
DiabetesStatusDiabetes                                     5.175e-01  1.678e+00  3.489e-01  1.483   0.1381  
SmokerCurrentno                                           -5.444e-01  5.802e-01  3.229e-01 -1.686   0.0918 .
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA  
Med.Statin.LLDno                                           9.463e-02  1.099e+00  3.667e-01  0.258   0.7964  
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA  
Med.all.antiplateletno                                     3.216e-01  1.379e+00  4.555e-01  0.706   0.4802  
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA  
GFR_MDRD                                                  -1.149e-02  9.886e-01  8.315e-03 -1.382   0.1669  
BMI                                                        2.137e-02  1.022e+00  4.270e-02  0.500   0.6168  
CAD_history                                                7.843e-01  2.191e+00  3.274e-01  2.395   0.0166 *
Stroke_history                                            -1.394e-01  8.699e-01  3.382e-01 -0.412   0.6803  
Peripheral.interv                                          5.109e-01  1.667e+00  3.537e-01  1.445   0.1486  
stenose0-49%                                              -8.090e-01  4.453e-01  9.205e+03  0.000   0.9999  
stenose50-70%                                              1.566e+01  6.305e+06  5.158e+03  0.003   0.9976  
stenose70-90%                                              1.598e+01  8.730e+06  5.158e+03  0.003   0.9975  
stenose90-99%                                              1.591e+01  8.127e+06  5.158e+03  0.003   0.9975  
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA  
stenoseNA                                                         NA         NA  0.000e+00     NA       NA  
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose99                                                         NA         NA  0.000e+00     NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] 1.291e+00  7.744e-01    0.6954     2.398
Age                                                       1.040e+00  9.615e-01    0.9943     1.088
Gendermale                                                1.911e+00  5.232e-01    0.8335     4.383
Hypertension.compositeno                                  7.791e-01  1.284e+00    0.2633     2.306
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.678e+00  5.960e-01    0.8467     3.325
SmokerCurrentno                                           5.802e-01  1.724e+00    0.3081     1.092
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.099e+00  9.097e-01    0.5357     2.256
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.379e+00  7.250e-01    0.5648     3.368
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.886e-01  1.012e+00    0.9726     1.005
BMI                                                       1.022e+00  9.789e-01    0.9396     1.111
CAD_history                                               2.191e+00  4.565e-01    1.1532     4.162
Stroke_history                                            8.699e-01  1.150e+00    0.4483     1.688
Peripheral.interv                                         1.667e+00  6.000e-01    0.8333     3.334
stenose0-49%                                              4.453e-01  2.246e+00    0.0000       Inf
stenose50-70%                                             6.305e+06  1.586e-07    0.0000       Inf
stenose70-90%                                             8.730e+06  1.145e-07    0.0000       Inf
stenose90-99%                                             8.127e+06  1.230e-07    0.0000       Inf
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.731  (se = 0.036 )
Likelihood ratio test= 31  on 17 df,   p=0.02
Wald test            = 23.03  on 17 df,   p=0.1
Score (logrank) test = 32.35  on 17 df,   p=0.01


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: MCP1_rank 
Effect size...............: 0.25569 
Standard error............: 0.315832 
Odds ratio (effect size)..: 1.291 
Lower 95% CI..............: 0.695 
Upper 95% CI..............: 2.398 
T-value...................: 0.809576 
P-value...................: 0.4181839 
Sample size in model......: 509 
Number of events..........: 44 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1002, number of events= 79 
   (1386 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]  5.813e-02  1.060e+00  2.304e-01  0.252  0.80083    
Age                                                       -3.043e-03  9.970e-01  1.510e-02 -0.201  0.84032    
Gendermale                                                 7.141e-01  2.042e+00  3.011e-01  2.372  0.01771 *  
Hypertension.compositeno                                  -7.882e-01  4.546e-01  5.252e-01 -1.501  0.13341    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -1.803e-01  8.351e-01  2.782e-01 -0.648  0.51711    
SmokerCurrentno                                           -5.750e-01  5.627e-01  2.428e-01 -2.369  0.01785 *  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           2.493e-01  1.283e+00  2.741e-01  0.909  0.36312    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     1.737e-01  1.190e+00  3.354e-01  0.518  0.60448    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -2.040e-02  9.798e-01  5.967e-03 -3.419  0.00063 ***
BMI                                                        1.169e-02  1.012e+00  3.338e-02  0.350  0.72620    
CAD_history                                                9.403e-01  2.561e+00  2.410e-01  3.901 9.56e-05 ***
Stroke_history                                            -1.024e-01  9.027e-01  2.526e-01 -0.405  0.68527    
Peripheral.interv                                          4.301e-01  1.537e+00  2.613e-01  1.646  0.09979 .  
stenose0-49%                                              -1.581e+01  1.357e-07  3.608e+03 -0.004  0.99650    
stenose50-70%                                             -1.055e+00  3.483e-01  1.233e+00 -0.856  0.39220    
stenose70-90%                                             -1.716e-02  9.830e-01  1.022e+00 -0.017  0.98661    
stenose90-99%                                             -1.699e-01  8.437e-01  1.022e+00 -0.166  0.86794    
stenose100% (Occlusion)                                   -1.551e+01  1.841e-07  3.150e+03 -0.005  0.99607    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                              1.291e+00  3.637e+00  1.459e+00  0.885  0.37628    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] 1.060e+00  9.435e-01   0.67470    1.6649
Age                                                       9.970e-01  1.003e+00   0.96789    1.0269
Gendermale                                                2.042e+00  4.896e-01   1.13195    3.6847
Hypertension.compositeno                                  4.546e-01  2.200e+00   0.16241    1.2727
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    8.351e-01  1.198e+00   0.48403    1.4407
SmokerCurrentno                                           5.627e-01  1.777e+00   0.34966    0.9055
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.283e+00  7.793e-01   0.74978    2.1959
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.190e+00  8.405e-01   0.61655    2.2958
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.798e-01  1.021e+00   0.96842    0.9913
BMI                                                       1.012e+00  9.884e-01   0.94768    1.0802
CAD_history                                               2.561e+00  3.905e-01   1.59668    4.1070
Stroke_history                                            9.027e-01  1.108e+00   0.55019    1.4810
Peripheral.interv                                         1.537e+00  6.504e-01   0.92119    2.5661
stenose0-49%                                              1.357e-07  7.370e+06   0.00000       Inf
stenose50-70%                                             3.483e-01  2.871e+00   0.03108    3.9018
stenose70-90%                                             9.830e-01  1.017e+00   0.13256    7.2891
stenose90-99%                                             8.437e-01  1.185e+00   0.11388    6.2514
stenose100% (Occlusion)                                   1.841e-07  5.432e+06   0.00000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             3.637e+00  2.750e-01   0.20825   63.5179
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.738  (se = 0.027 )
Likelihood ratio test= 61.46  on 19 df,   p=2e-06
Wald test            = 60.06  on 19 df,   p=4e-06
Score (logrank) test = 64.83  on 19 df,   p=7e-07


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: 0.058129 
Standard error............: 0.230422 
Odds ratio (effect size)..: 1.06 
Lower 95% CI..............: 0.675 
Upper 95% CI..............: 1.665 
T-value...................: 0.252272 
P-value...................: 0.8008308 
Sample size in model......: 1002 
Number of events..........: 79 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1006, number of events= 81 
   (1382 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]  3.112e-01  1.365e+00  2.338e-01  1.331 0.183175    
Age                                                       -9.543e-04  9.990e-01  1.485e-02 -0.064 0.948766    
Gendermale                                                 5.574e-01  1.746e+00  2.851e-01  1.955 0.050527 .  
Hypertension.compositeno                                  -8.059e-01  4.467e-01  5.248e-01 -1.536 0.124600    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -1.867e-01  8.297e-01  2.766e-01 -0.675 0.499578    
SmokerCurrentno                                           -5.490e-01  5.775e-01  2.406e-01 -2.282 0.022506 *  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           1.850e-01  1.203e+00  2.751e-01  0.673 0.501211    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     2.059e-01  1.229e+00  3.353e-01  0.614 0.539303    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -2.060e-02  9.796e-01  5.884e-03 -3.501 0.000464 ***
BMI                                                        7.733e-03  1.008e+00  3.365e-02  0.230 0.818252    
CAD_history                                                9.287e-01  2.531e+00  2.382e-01  3.898 9.69e-05 ***
Stroke_history                                            -1.891e-01  8.277e-01  2.508e-01 -0.754 0.450860    
Peripheral.interv                                          3.230e-01  1.381e+00  2.580e-01  1.252 0.210705    
stenose0-49%                                              -1.552e+01  1.820e-07  3.417e+03 -0.005 0.996376    
stenose50-70%                                             -1.047e+00  3.509e-01  1.231e+00 -0.851 0.394713    
stenose70-90%                                             -1.764e-01  8.383e-01  1.023e+00 -0.172 0.863099    
stenose90-99%                                             -2.621e-01  7.694e-01  1.023e+00 -0.256 0.797760    
stenose100% (Occlusion)                                   -1.525e+01  2.383e-07  2.534e+03 -0.006 0.995199    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                              9.092e-01  2.482e+00  1.444e+00  0.629 0.529066    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 1.365e+00  7.325e-01   0.86324    2.1588
Age                                                       9.990e-01  1.001e+00   0.97039    1.0286
Gendermale                                                1.746e+00  5.727e-01   0.99872    3.0529
Hypertension.compositeno                                  4.467e-01  2.239e+00   0.15970    1.2493
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    8.297e-01  1.205e+00   0.48248    1.4267
SmokerCurrentno                                           5.775e-01  1.732e+00   0.36039    0.9255
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.203e+00  8.311e-01   0.70178    2.0630
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.229e+00  8.140e-01   0.63674    2.3705
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.796e-01  1.021e+00   0.96838    0.9910
BMI                                                       1.008e+00  9.923e-01   0.94344    1.0765
CAD_history                                               2.531e+00  3.951e-01   1.58689    4.0375
Stroke_history                                            8.277e-01  1.208e+00   0.50632    1.3531
Peripheral.interv                                         1.381e+00  7.240e-01   0.83296    2.2903
stenose0-49%                                              1.820e-07  5.495e+06   0.00000       Inf
stenose50-70%                                             3.509e-01  2.850e+00   0.03145    3.9140
stenose70-90%                                             8.383e-01  1.193e+00   0.11291    6.2240
stenose90-99%                                             7.694e-01  1.300e+00   0.10364    5.7124
stenose100% (Occlusion)                                   2.383e-07  4.196e+06   0.00000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.482e+00  4.028e-01   0.14633   42.1104
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.73  (se = 0.029 )
Likelihood ratio test= 60.73  on 19 df,   p=3e-06
Wald test            = 60.13  on 19 df,   p=4e-06
Score (logrank) test = 63.68  on 19 df,   p=1e-06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.311249 
Standard error............: 0.233838 
Odds ratio (effect size)..: 1.365 
Lower 95% CI..............: 0.863 
Upper 95% CI..............: 2.159 
T-value...................: 1.331043 
P-value...................: 0.1831749 
Sample size in model......: 1006 
Number of events..........: 81 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1044, number of events= 81 
   (1344 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] -1.596e-02  9.842e-01  2.268e-01 -0.070 0.943890    
Age                                                       -1.539e-03  9.985e-01  1.479e-02 -0.104 0.917138    
Gendermale                                                 6.124e-01  1.845e+00  2.852e-01  2.147 0.031760 *  
Hypertension.compositeno                                  -8.179e-01  4.414e-01  5.250e-01 -1.558 0.119285    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -2.171e-01  8.048e-01  2.764e-01 -0.785 0.432187    
SmokerCurrentno                                           -5.707e-01  5.651e-01  2.391e-01 -2.387 0.016980 *  
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           2.564e-01  1.292e+00  2.724e-01  0.941 0.346513    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     1.932e-01  1.213e+00  3.346e-01  0.577 0.563740    
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -2.177e-02  9.785e-01  5.897e-03 -3.691 0.000223 ***
BMI                                                        9.025e-03  1.009e+00  3.301e-02  0.273 0.784560    
CAD_history                                                9.195e-01  2.508e+00  2.377e-01  3.868 0.000110 ***
Stroke_history                                            -1.476e-01  8.628e-01  2.513e-01 -0.587 0.556941    
Peripheral.interv                                          3.358e-01  1.399e+00  2.589e-01  1.297 0.194621    
stenose0-49%                                              -1.549e+01  1.880e-07  3.028e+03 -0.005 0.995919    
stenose50-70%                                             -1.074e+00  3.417e-01  1.233e+00 -0.871 0.383723    
stenose70-90%                                             -1.110e-01  8.949e-01  1.023e+00 -0.109 0.913589    
stenose90-99%                                             -1.822e-01  8.334e-01  1.023e+00 -0.178 0.858652    
stenose100% (Occlusion)                                   -1.520e+01  2.509e-07  2.633e+03 -0.006 0.995394    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                              1.014e+00  2.758e+00  1.440e+00  0.705 0.481061    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 9.842e-01  1.016e+00    0.6310    1.5351
Age                                                       9.985e-01  1.002e+00    0.9699    1.0278
Gendermale                                                1.845e+00  5.420e-01    1.0549    3.2265
Hypertension.compositeno                                  4.414e-01  2.266e+00    0.1577    1.2351
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    8.048e-01  1.242e+00    0.4682    1.3835
SmokerCurrentno                                           5.651e-01  1.770e+00    0.3537    0.9029
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.292e+00  7.738e-01    0.7577    2.2040
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.213e+00  8.244e-01    0.6296    2.3371
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.785e-01  1.022e+00    0.9672    0.9898
BMI                                                       1.009e+00  9.910e-01    0.9458    1.0765
CAD_history                                               2.508e+00  3.987e-01    1.5740    3.9966
Stroke_history                                            8.628e-01  1.159e+00    0.5272    1.4119
Peripheral.interv                                         1.399e+00  7.147e-01    0.8423    2.3240
stenose0-49%                                              1.880e-07  5.318e+06    0.0000       Inf
stenose50-70%                                             3.417e-01  2.926e+00    0.0305    3.8279
stenose70-90%                                             8.949e-01  1.117e+00    0.1204    6.6502
stenose90-99%                                             8.334e-01  1.200e+00    0.1122    6.1898
stenose100% (Occlusion)                                   2.509e-07  3.986e+06    0.0000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             2.758e+00  3.626e-01    0.1641   46.3478
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.732  (se = 0.027 )
Likelihood ratio test= 60.47  on 19 df,   p=3e-06
Wald test            = 59.13  on 19 df,   p=5e-06
Score (logrank) test = 62.13  on 19 df,   p=2e-06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epcoronary.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcoronary.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: -0.015964 
Standard error............: 0.226816 
Odds ratio (effect size)..: 0.984 
Lower 95% CI..............: 0.631 
Upper 95% CI..............: 1.535 
T-value...................: -0.070382 
P-value...................: 0.9438898 
Sample size in model......: 1044 
Number of events..........: 81 
* Analyzing the effect of plaque proteins on [epcvdeath.3years].
 - creating temporary SE for this work.
 - making a 'Surv' object and adding this to temporary dataframe.
 - making strata of each of the plaque proteins and start survival analysis.
   > processing [IL6_rank]; 1 out of 5 proteins.
   > cross tabulation of IL6_rank-stratum.

[-1.48329,0.00474) [ 0.00474,3.10694] 
               265                264 

   > fitting the model for IL6_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 477, number of events= 23 
   (1911 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] -9.187e-02  9.122e-01  4.309e-01 -0.213   0.8312  
Age                                                        6.195e-02  1.064e+00  3.229e-02  1.919   0.0550 .
Gendermale                                                 6.438e-01  1.904e+00  5.718e-01  1.126   0.2602  
Hypertension.compositeno                                  -1.812e+01  1.351e-08  4.520e+03 -0.004   0.9968  
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA  
DiabetesStatusDiabetes                                     6.838e-01  1.981e+00  5.048e-01  1.354   0.1756  
SmokerCurrentno                                           -7.494e-01  4.726e-01  4.470e-01 -1.677   0.0936 .
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA  
Med.Statin.LLDno                                           6.669e-01  1.948e+00  4.697e-01  1.420   0.1556  
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA  
Med.all.antiplateletno                                     5.143e-01  1.672e+00  6.467e-01  0.795   0.4265  
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA  
GFR_MDRD                                                  -1.130e-02  9.888e-01  1.115e-02 -1.014   0.3107  
BMI                                                        3.610e-02  1.037e+00  5.620e-02  0.642   0.5207  
CAD_history                                                5.531e-01  1.739e+00  4.562e-01  1.212   0.2254  
Stroke_history                                             1.645e-01  1.179e+00  4.525e-01  0.364   0.7162  
Peripheral.interv                                          2.184e-01  1.244e+00  5.444e-01  0.401   0.6882  
stenose0-49%                                              -5.590e-01  5.718e-01  3.107e+04  0.000   1.0000  
stenose50-70%                                              4.197e-01  1.521e+00  1.643e+04  0.000   1.0000  
stenose70-90%                                              1.810e+01  7.291e+07  1.408e+04  0.001   0.9990  
stenose90-99%                                              1.800e+01  6.555e+07  1.408e+04  0.001   0.9990  
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA  
stenoseNA                                                         NA         NA  0.000e+00     NA       NA  
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose99                                                         NA         NA  0.000e+00     NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00474,3.10694] 9.122e-01  1.096e+00    0.3920     2.123
Age                                                       1.064e+00  9.399e-01    0.9987     1.133
Gendermale                                                1.904e+00  5.253e-01    0.6207     5.839
Hypertension.compositeno                                  1.351e-08  7.403e+07    0.0000       Inf
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.981e+00  5.047e-01    0.7366     5.329
SmokerCurrentno                                           4.726e-01  2.116e+00    0.1968     1.135
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.948e+00  5.133e-01    0.7760     4.892
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.672e+00  5.979e-01    0.4708     5.940
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.888e-01  1.011e+00    0.9674     1.011
BMI                                                       1.037e+00  9.645e-01    0.9286     1.157
CAD_history                                               1.739e+00  5.752e-01    0.7110     4.251
Stroke_history                                            1.179e+00  8.483e-01    0.4856     2.861
Peripheral.interv                                         1.244e+00  8.038e-01    0.4280     3.616
stenose0-49%                                              5.718e-01  1.749e+00    0.0000       Inf
stenose50-70%                                             1.521e+00  6.573e-01    0.0000       Inf
stenose70-90%                                             7.291e+07  1.372e-08    0.0000       Inf
stenose90-99%                                             6.555e+07  1.526e-08    0.0000       Inf
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.791  (se = 0.041 )
Likelihood ratio test= 26.72  on 17 df,   p=0.06
Wald test            = 9.85  on 17 df,   p=0.9
Score (logrank) test = 22.16  on 17 df,   p=0.2


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6_rank 
Effect size...............: -0.091872 
Standard error............: 0.430914 
Odds ratio (effect size)..: 0.912 
Lower 95% CI..............: 0.392 
Upper 95% CI..............: 2.123 
T-value...................: -0.213202 
P-value...................: 0.8311691 
Sample size in model......: 477 
Number of events..........: 23 
   > processing [MCP1_rank]; 2 out of 5 proteins.
   > cross tabulation of MCP1_rank-stratum.

[-2.41053,0.00444) [ 0.00444,3.12635] 
               283                282 

   > fitting the model for MCP1_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 509, number of events= 24 
   (1879 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)  
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] -1.771e-01  8.377e-01  4.270e-01 -0.415   0.6783  
Age                                                        5.662e-02  1.058e+00  3.156e-02  1.794   0.0728 .
Gendermale                                                 6.642e-01  1.943e+00  5.609e-01  1.184   0.2364  
Hypertension.compositeno                                  -1.815e+01  1.310e-08  4.307e+03 -0.004   0.9966  
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA  
DiabetesStatusDiabetes                                     6.356e-01  1.888e+00  5.042e-01  1.261   0.2075  
SmokerCurrentno                                           -8.101e-01  4.448e-01  4.374e-01 -1.852   0.0640 .
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA  
Med.Statin.LLDno                                           6.893e-01  1.992e+00  4.646e-01  1.484   0.1379  
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA  
Med.all.antiplateletno                                     2.638e-01  1.302e+00  6.552e-01  0.403   0.6872  
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA  
GFR_MDRD                                                  -2.066e-02  9.796e-01  1.089e-02 -1.897   0.0578 .
BMI                                                        1.251e-02  1.013e+00  5.815e-02  0.215   0.8296  
CAD_history                                                2.554e-01  1.291e+00  4.455e-01  0.573   0.5665  
Stroke_history                                             2.185e-01  1.244e+00  4.350e-01  0.502   0.6154  
Peripheral.interv                                          5.211e-01  1.684e+00  5.060e-01  1.030   0.3031  
stenose0-49%                                              -7.104e-01  4.914e-01  3.570e+04  0.000   1.0000  
stenose50-70%                                              3.764e-01  1.457e+00  2.096e+04  0.000   1.0000  
stenose70-90%                                              1.826e+01  8.550e+07  1.922e+04  0.001   0.9992  
stenose90-99%                                              1.805e+01  6.936e+07  1.922e+04  0.001   0.9993  
stenose100% (Occlusion)                                           NA         NA  0.000e+00     NA       NA  
stenoseNA                                                         NA         NA  0.000e+00     NA       NA  
stenose50-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA  
stenose99                                                         NA         NA  0.000e+00     NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00444,3.12635] 8.377e-01  1.194e+00    0.3628     1.934
Age                                                       1.058e+00  9.450e-01    0.9948     1.126
Gendermale                                                1.943e+00  5.147e-01    0.6472     5.833
Hypertension.compositeno                                  1.310e-08  7.634e+07    0.0000       Inf
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.888e+00  5.296e-01    0.7028     5.072
SmokerCurrentno                                           4.448e-01  2.248e+00    0.1887     1.048
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.992e+00  5.019e-01    0.8015     4.953
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    1.302e+00  7.681e-01    0.3605     4.702
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.796e-01  1.021e+00    0.9589     1.001
BMI                                                       1.013e+00  9.876e-01    0.9035     1.135
CAD_history                                               1.291e+00  7.746e-01    0.5391     3.091
Stroke_history                                            1.244e+00  8.037e-01    0.5305     2.918
Peripheral.interv                                         1.684e+00  5.939e-01    0.6246     4.540
stenose0-49%                                              4.914e-01  2.035e+00    0.0000       Inf
stenose50-70%                                             1.457e+00  6.863e-01    0.0000       Inf
stenose70-90%                                             8.550e+07  1.170e-08    0.0000       Inf
stenose90-99%                                             6.936e+07  1.442e-08    0.0000       Inf
stenose100% (Occlusion)                                          NA         NA        NA        NA
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                                    NA         NA        NA        NA
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.801  (se = 0.04 )
Likelihood ratio test= 29.16  on 17 df,   p=0.03
Wald test            = 9.19  on 17 df,   p=0.9
Score (logrank) test = 24.7  on 17 df,   p=0.1


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: MCP1_rank 
Effect size...............: -0.177103 
Standard error............: 0.426996 
Odds ratio (effect size)..: 0.838 
Lower 95% CI..............: 0.363 
Upper 95% CI..............: 1.934 
T-value...................: -0.414764 
P-value...................: 0.6783146 
Sample size in model......: 509 
Number of events..........: 24 
   > processing [IL6_pg_ug_2015_rank]; 3 out of 5 proteins.
   > cross tabulation of IL6_pg_ug_2015_rank-stratum.

[-3.33061,0.00109) [ 0.00109,3.33061] 
               577                577 

   > fitting the model for IL6_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1002, number of events= 35 
   (1386 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061]  3.124e-01  1.367e+00  3.495e-01  0.894 0.371352    
Age                                                        6.928e-02  1.072e+00  2.589e-02  2.676 0.007450 ** 
Gendermale                                                 1.013e+00  2.755e+00  4.933e-01  2.054 0.039942 *  
Hypertension.compositeno                                  -1.767e+01  2.123e-08  3.770e+03 -0.005 0.996261    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -5.545e-02  9.461e-01  4.082e-01 -0.136 0.891958    
SmokerCurrentno                                           -4.117e-01  6.625e-01  3.828e-01 -1.076 0.282106    
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           3.902e-02  1.040e+00  4.239e-01  0.092 0.926647    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     1.096e+00  2.991e+00  3.963e-01  2.765 0.005696 ** 
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -3.121e-02  9.693e-01  9.102e-03 -3.428 0.000607 ***
BMI                                                        6.702e-02  1.069e+00  5.147e-02  1.302 0.192850    
CAD_history                                                2.453e-01  1.278e+00  3.548e-01  0.692 0.489238    
Stroke_history                                            -1.405e-01  8.689e-01  3.867e-01 -0.363 0.716259    
Peripheral.interv                                          6.223e-01  1.863e+00  4.073e-01  1.528 0.126503    
stenose0-49%                                              -1.957e+01  3.162e-09  2.801e+04 -0.001 0.999442    
stenose50-70%                                             -8.921e-01  4.098e-01  1.238e+00 -0.720 0.471253    
stenose70-90%                                             -1.380e+00  2.515e-01  1.065e+00 -1.296 0.195019    
stenose90-99%                                             -8.273e-01  4.372e-01  1.042e+00 -0.794 0.427146    
stenose100% (Occlusion)                                   -1.912e+01  4.954e-09  1.969e+04 -0.001 0.999225    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.913e+01  4.932e-09  4.806e+04  0.000 0.999682    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00109,3.33061] 1.367e+00  7.317e-01   0.68899    2.7110
Age                                                       1.072e+00  9.331e-01   1.01871    1.1275
Gendermale                                                2.755e+00  3.630e-01   1.04766    7.2440
Hypertension.compositeno                                  2.123e-08  4.709e+07   0.00000       Inf
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.461e-01  1.057e+00   0.42503    2.1058
SmokerCurrentno                                           6.625e-01  1.509e+00   0.31288    1.4029
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.040e+00  9.617e-01   0.45305    2.3865
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    2.991e+00  3.343e-01   1.37565    6.5034
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.693e-01  1.032e+00   0.95214    0.9867
BMI                                                       1.069e+00  9.352e-01   0.96671    1.1828
CAD_history                                               1.278e+00  7.824e-01   0.63761    2.5618
Stroke_history                                            8.689e-01  1.151e+00   0.40722    1.8539
Peripheral.interv                                         1.863e+00  5.367e-01   0.83869    4.1396
stenose0-49%                                              3.162e-09  3.162e+08   0.00000       Inf
stenose50-70%                                             4.098e-01  2.440e+00   0.03619    4.6407
stenose70-90%                                             2.515e-01  3.976e+00   0.03118    2.0286
stenose90-99%                                             4.372e-01  2.287e+00   0.05675    3.3690
stenose100% (Occlusion)                                   4.954e-09  2.018e+08   0.00000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             4.932e-09  2.028e+08   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.841  (se = 0.028 )
Likelihood ratio test= 59.89  on 19 df,   p=4e-06
Wald test            = 21.5  on 19 df,   p=0.3
Score (logrank) test = 56.6  on 19 df,   p=1e-05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6_pg_ug_2015_rank 
Effect size...............: 0.312398 
Standard error............: 0.349461 
Odds ratio (effect size)..: 1.367 
Lower 95% CI..............: 0.689 
Upper 95% CI..............: 2.711 
T-value...................: 0.893944 
P-value...................: 0.3713521 
Sample size in model......: 1002 
Number of events..........: 35 
   > processing [IL6R_pg_ug_2015_rank]; 4 out of 5 proteins.
   > cross tabulation of IL6R_pg_ug_2015_rank-stratum.

[-3.33109,0.00108) [ 0.00108,3.33109] 
               578                578 

   > fitting the model for IL6R_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1006, number of events= 35 
   (1382 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109]  5.464e-01  1.727e+00  3.680e-01  1.485 0.137593    
Age                                                        6.965e-02  1.072e+00  2.601e-02  2.677 0.007422 ** 
Gendermale                                                 1.005e+00  2.732e+00  4.908e-01  2.048 0.040545 *  
Hypertension.compositeno                                  -1.772e+01  2.009e-08  3.857e+03 -0.005 0.996334    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                     4.218e-02  1.043e+00  4.083e-01  0.103 0.917718    
SmokerCurrentno                                           -3.826e-01  6.821e-01  3.836e-01 -0.997 0.318610    
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                          -3.352e-02  9.670e-01  4.260e-01 -0.079 0.937271    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     1.105e+00  3.019e+00  3.963e-01  2.788 0.005308 ** 
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -3.056e-02  9.699e-01  9.111e-03 -3.354 0.000795 ***
BMI                                                        6.759e-02  1.070e+00  5.231e-02  1.292 0.196361    
CAD_history                                                2.611e-01  1.298e+00  3.523e-01  0.741 0.458589    
Stroke_history                                            -1.680e-01  8.454e-01  3.863e-01 -0.435 0.663620    
Peripheral.interv                                          5.397e-01  1.716e+00  4.005e-01  1.348 0.177778    
stenose0-49%                                              -1.933e+01  4.012e-09  3.424e+04 -0.001 0.999549    
stenose50-70%                                             -9.530e-01  3.856e-01  1.235e+00 -0.772 0.440403    
stenose70-90%                                             -1.527e+00  2.172e-01  1.063e+00 -1.437 0.150749    
stenose90-99%                                             -1.042e+00  3.528e-01  1.045e+00 -0.997 0.318684    
stenose100% (Occlusion)                                   -1.934e+01  3.981e-09  2.180e+04 -0.001 0.999292    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.899e+01  5.679e-09  3.413e+04 -0.001 0.999556    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00108,3.33109] 1.727e+00  5.790e-01   0.83957    3.5528
Age                                                       1.072e+00  9.327e-01   1.01884    1.1282
Gendermale                                                2.732e+00  3.660e-01   1.04423    7.1500
Hypertension.compositeno                                  2.009e-08  4.978e+07   0.00000       Inf
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    1.043e+00  9.587e-01   0.46857    2.3220
SmokerCurrentno                                           6.821e-01  1.466e+00   0.32163    1.4467
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          9.670e-01  1.034e+00   0.41961    2.2286
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    3.019e+00  3.313e-01   1.38825    6.5635
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.699e-01  1.031e+00   0.95273    0.9874
BMI                                                       1.070e+00  9.346e-01   0.96566    1.1854
CAD_history                                               1.298e+00  7.702e-01   0.65089    2.5901
Stroke_history                                            8.454e-01  1.183e+00   0.39652    1.8023
Peripheral.interv                                         1.716e+00  5.829e-01   0.78252    3.7609
stenose0-49%                                              4.012e-09  2.493e+08   0.00000       Inf
stenose50-70%                                             3.856e-01  2.593e+00   0.03426    4.3404
stenose70-90%                                             2.172e-01  4.604e+00   0.02706    1.7434
stenose90-99%                                             3.528e-01  2.835e+00   0.04551    2.7347
stenose100% (Occlusion)                                   3.981e-09  2.512e+08   0.00000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             5.679e-09  1.761e+08   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.839  (se = 0.03 )
Likelihood ratio test= 61.36  on 19 df,   p=2e-06
Wald test            = 24.03  on 19 df,   p=0.2
Score (logrank) test = 59.66  on 19 df,   p=4e-06


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' IL6R_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: IL6R_pg_ug_2015_rank 
Effect size...............: 0.546431 
Standard error............: 0.368013 
Odds ratio (effect size)..: 1.727 
Lower 95% CI..............: 0.84 
Upper 95% CI..............: 3.553 
T-value...................: 1.484815 
P-value...................: 0.1375929 
Sample size in model......: 1006 
Number of events..........: 35 
   > processing [MCP1_pg_ug_2015_rank]; 5 out of 5 proteins.
   > cross tabulation of MCP1_pg_ug_2015_rank-stratum.

[-3.34148,0.00104) [ 0.00104,3.34148] 
               600                600 

   > fitting the model for MCP1_pg_ug_2015_rank-stratum.

   > make a Kaplan-Meier-shizzle...
Vectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

   > perform the Cox-regression fashizzle and plot it...

Call:
coxph(formula = Surv(TEMP.DF[, eptime], event) ~ TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]] + 
    Age + Gender + Hypertension.composite + DiabetesStatus + 
    SmokerCurrent + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + 
    BMI + CAD_history + Stroke_history + Peripheral.interv + 
    stenose, data = TEMP.DF)

  n= 1044, number of events= 35 
   (1344 observations deleted due to missingness)

                                                                coef  exp(coef)   se(coef)      z Pr(>|z|)    
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] -2.174e-02  9.785e-01  3.452e-01 -0.063 0.949793    
Age                                                        6.789e-02  1.070e+00  2.577e-02  2.635 0.008421 ** 
Gendermale                                                 1.041e+00  2.832e+00  4.920e-01  2.116 0.034334 *  
Hypertension.compositeno                                  -1.769e+01  2.075e-08  3.765e+03 -0.005 0.996251    
Hypertension.compositeyes                                         NA         NA  0.000e+00     NA       NA    
DiabetesStatusDiabetes                                    -2.627e-02  9.741e-01  4.067e-01 -0.065 0.948492    
SmokerCurrentno                                           -4.254e-01  6.535e-01  3.816e-01 -1.115 0.264940    
SmokerCurrentyes                                                  NA         NA  0.000e+00     NA       NA    
Med.Statin.LLDno                                           8.787e-02  1.092e+00  4.219e-01  0.208 0.834997    
Med.Statin.LLDyes                                                 NA         NA  0.000e+00     NA       NA    
Med.all.antiplateletno                                     1.088e+00  2.970e+00  3.978e-01  2.736 0.006214 ** 
Med.all.antiplateletyes                                           NA         NA  0.000e+00     NA       NA    
GFR_MDRD                                                  -3.243e-02  9.681e-01  9.119e-03 -3.556 0.000376 ***
BMI                                                        6.918e-02  1.072e+00  5.133e-02  1.348 0.177742    
CAD_history                                                2.495e-01  1.283e+00  3.531e-01  0.707 0.479796    
Stroke_history                                            -1.160e-01  8.905e-01  3.884e-01 -0.299 0.765236    
Peripheral.interv                                          5.734e-01  1.774e+00  4.037e-01  1.421 0.155458    
stenose0-49%                                              -1.972e+01  2.716e-09  2.937e+04 -0.001 0.999464    
stenose50-70%                                             -9.727e-01  3.781e-01  1.239e+00 -0.785 0.432437    
stenose70-90%                                             -1.445e+00  2.358e-01  1.068e+00 -1.353 0.176192    
stenose90-99%                                             -9.011e-01  4.061e-01  1.048e+00 -0.860 0.389738    
stenose100% (Occlusion)                                   -1.926e+01  4.335e-09  2.009e+04 -0.001 0.999235    
stenoseNA                                                         NA         NA  0.000e+00     NA       NA    
stenose50-99%                                             -1.904e+01  5.407e-09  3.419e+04 -0.001 0.999556    
stenose70-99%                                                     NA         NA  0.000e+00     NA       NA    
stenose99                                                         NA         NA  0.000e+00     NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

                                                          exp(coef) exp(-coef) lower .95 upper .95
TEMP.DF[[TRAITS.PROTEIN.RANK[protein]]][ 0.00104,3.34148] 9.785e-01  1.022e+00   0.49743    1.9248
Age                                                       1.070e+00  9.344e-01   1.01754    1.1257
Gendermale                                                2.832e+00  3.531e-01   1.07986    7.4287
Hypertension.compositeno                                  2.075e-08  4.820e+07   0.00000       Inf
Hypertension.compositeyes                                        NA         NA        NA        NA
DiabetesStatusDiabetes                                    9.741e-01  1.027e+00   0.43893    2.1616
SmokerCurrentno                                           6.535e-01  1.530e+00   0.30931    1.3806
SmokerCurrentyes                                                 NA         NA        NA        NA
Med.Statin.LLDno                                          1.092e+00  9.159e-01   0.47761    2.4961
Med.Statin.LLDyes                                                NA         NA        NA        NA
Med.all.antiplateletno                                    2.970e+00  3.368e-01   1.36177    6.4754
Med.all.antiplateletyes                                          NA         NA        NA        NA
GFR_MDRD                                                  9.681e-01  1.033e+00   0.95094    0.9855
BMI                                                       1.072e+00  9.332e-01   0.96906    1.1851
CAD_history                                               1.283e+00  7.792e-01   0.64242    2.5638
Stroke_history                                            8.905e-01  1.123e+00   0.41589    1.9066
Peripheral.interv                                         1.774e+00  5.636e-01   0.80432    3.9142
stenose0-49%                                              2.716e-09  3.681e+08   0.00000       Inf
stenose50-70%                                             3.781e-01  2.645e+00   0.03333    4.2880
stenose70-90%                                             2.358e-01  4.241e+00   0.02906    1.9132
stenose90-99%                                             4.061e-01  2.462e+00   0.05211    3.1654
stenose100% (Occlusion)                                   4.335e-09  2.307e+08   0.00000       Inf
stenoseNA                                                        NA         NA        NA        NA
stenose50-99%                                             5.407e-09  1.849e+08   0.00000       Inf
stenose70-99%                                                    NA         NA        NA        NA
stenose99                                                        NA         NA        NA        NA

Concordance= 0.839  (se = 0.029 )
Likelihood ratio test= 60.04  on 19 df,   p=4e-06
Wald test            = 21.96  on 19 df,   p=0.3
Score (logrank) test = 56.98  on 19 df,   p=1e-05


   > writing the Cox-regression fashizzle to Excel...
Summarizing Cox regression results for ' MCP1_pg_ug_2015_rank ' and its association to ' epcvdeath.3years ' in ' AEDB.CEA '.
Collecting data.

We have collected the following:
Dataset used..............: AEDB.CEA 
Outcome analyzed..........: epcvdeath.3years 
Protein...................: MCP1_pg_ug_2015_rank 
Effect size...............: -0.021735 
Standard error............: 0.345188 
Odds ratio (effect size)..: 0.978 
Lower 95% CI..............: 0.497 
Upper 95% CI..............: 1.925 
T-value...................: -0.062967 
P-value...................: 0.9497931 
Sample size in model......: 1044 
Number of events..........: 35 

cat("- Edit the column names...\n")
- Edit the column names...
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
- Correct the variable types...
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
cat("- Writing results to Excel-file...\n")
- Writing results to Excel-file...
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL2.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
- Removing intermediate files...
rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

rm(head.style)
object 'head.style' not found

30-days follow-up

MODEL 1

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times30)){
  eptime = times30[i]
  ep = endpoints30[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    ylim = c(0.75, 1),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [days]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".30days.pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 1 (Simple model)
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age+Gender + ORdate_year, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age+Gender + ORdate_year, data = TEMP.DF)

    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         ylim = c(0.75, 1), xlim = c(0,3), col = c("#595A5C", "#DB003F", "#1290D9"),
         # ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [days]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL1.30days.pdf"), height = 12, width = 10, onefile = TRUE)
    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}

cat("- Edit the column names...\n")
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
library(openxlsx)
cat("- Writing results to Excel-file...\n")
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL1.30days.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
#rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

#rm(head.style)

MODEL 2

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times30)){
  eptime = times30[i]
  ep = endpoints30[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  #as.integer(TEMP.DF[,ep] == "Excluded")

  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    ylim = c(0.75, 1),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [days]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".30days.pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 2 adjusted for age, sex, hypertension, diabetes, smoking, LDL-C levels, lipid-lowering drugs, antiplatelet drugs, eGFR, BMI, history of CVD, level of stenosis
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose, data = TEMP.DF)

  
    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         ylim = c(0.75, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         # ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [days]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL2.30days.pdf"), height = 12, width = 10, onefile = TRUE)

    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}

cat("- Edit the column names...\n")
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
cat("- Writing results to Excel-file...\n")
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL2.30days.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

rm(head.style)

90-days follow-up

MODEL 1

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times90)){
  eptime = times90[i]
  ep = endpoints90[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    ylim = c(0.75, 1),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [days]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".90days.pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 1 (Simple model)
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age+Gender + ORdate_year, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age+Gender + ORdate_year, data = TEMP.DF)

    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         ylim = c(0.75, 1), xlim = c(0,3), col = c("#595A5C", "#DB003F", "#1290D9"),
         # ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [days]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL1.90days.pdf"), height = 12, width = 10, onefile = TRUE)
    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}

cat("- Edit the column names...\n")
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
library(openxlsx)
cat("- Writing results to Excel-file...\n")
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL1.90days.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
#rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

#rm(head.style)

MODEL 2

# Set up a dataframe to receive results
COX.results <- data.frame(matrix(NA, ncol = 12, nrow = 0))

# Looping over each protein/endpoint/time combination
for (i in 1:length(times90)){
  eptime = times90[i]
  ep = endpoints90[i]
  cat(paste0("* Analyzing the effect of plaque proteins on [",ep,"].\n"))
  cat(" - creating temporary SE for this work.\n")
  TEMP.DF = as.data.frame(AEDB.CEA)
  cat(" - making a 'Surv' object and adding this to temporary dataframe.\n")
  TEMP.DF$event <- as.integer(TEMP.DF[,ep])
  #as.integer(TEMP.DF[,ep] == "Excluded")

  TEMP.DF$y <- Surv(time = TEMP.DF[,eptime], event = TEMP.DF$event)
  cat(" - making strata of each of the plaque proteins and start survival analysis.\n")
  
  for (protein in 1:length(TRAITS.PROTEIN.RANK)){
    cat(paste0("   > processing [",TRAITS.PROTEIN.RANK[protein],"]; ",protein," out of ",length(TRAITS.PROTEIN.RANK)," proteins.\n"))
    # splitting into two groups
    TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]] <- cut2(TEMP.DF[,TRAITS.PROTEIN.RANK[protein]], g = 2)
    cat(paste0("   > cross tabulation of ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    show(table(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]))
    
    cat(paste0("\n   > fitting the model for ",TRAITS.PROTEIN.RANK[protein],"-stratum.\n"))
    fit <- survfit(as.formula(paste0("y ~ ", TRAITS.PROTEIN.RANK[protein])), data = TEMP.DF)
    
    cat(paste0("\n   > make a Kaplan-Meier-shizzle...\n"))
    # make Kaplan-Meier curve and save it
    show(ggsurvplot(fit, data = TEMP.DF,
                    palette = c("#DB003F", "#1290D9"),
                    # palete = c("F59D10", "#DB003F", "#49A01D", "#1290D9"),
                    linetype = c(1,2),
                    ylim = c(0.75, 1),
                    # linetype = c(1,2,3,4),
                    # conf.int = FALSE, conf.int.fill = "#595A5C", conf.int.alpha = 0.1,
                    pval = FALSE, pval.method = FALSE, pval.size = 4,
                    risk.table = TRUE, risk.table.y.text = FALSE, tables.y.text.col = TRUE, fontsize = 4,
                    censor = FALSE,
                    legend = "right",
                    legend.title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
                    legend.labs = c("low", "high"),
                    title = paste0("Risk of ",ep,""), xlab = "Time [days]", font.main = c(16, "bold", "black")))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.survival.",ep,".2G.",
                               TRAITS.PROTEIN.RANK[protein],".90days.pdf"), width = 12, height = 10, onefile = FALSE)

    cat(paste0("\n   > perform the Cox-regression fashizzle and plot it...\n"))
    ### Do Cox-regression and plot it
    
    ### MODEL 2 adjusted for age, sex, hypertension, diabetes, smoking, LDL-C levels, lipid-lowering drugs, antiplatelet drugs, eGFR, BMI, history of CVD, level of stenosis
    cox = coxph(Surv(TEMP.DF[,eptime], event) ~ TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]]+Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose, data = TEMP.DF)
    coxplot = coxph(Surv(TEMP.DF[,eptime], event) ~ strata(TEMP.DF[[ TRAITS.PROTEIN.RANK[protein] ]])+Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose, data = TEMP.DF)

  
    plot(survfit(coxplot), main = paste0("Cox proportional hazard of [",ep,"] per [",eptime,"]."),
         ylim = c(0.75, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         # ylim = c(0, 1), xlim = c(0,3), col = c("#DB003F", "#1290D9"),
         lty = c(1,2), lwd = 2,
         ylab = "Suvival probability", xlab = "FU time [days]",
         mark.time = FALSE, axes = FALSE, bty = "n")
    legend("topright",
           c("low", "high"),
           title = paste0("",TRAITS.PROTEIN.RANK[protein],""),
           col = c("#DB003F", "#1290D9"),
           lty = c(1,2), lwd = 2,
           bty = "n")
    axis(side = 1, at = seq(0, 3, by = 1))
    axis(side = 2, at = seq(0, 1, by = 0.2))
    dev.copy2pdf(file = paste0(COX_loc,"/",
                               Today,".AEDB.CEA.Cox.",ep,".2G.",
                               # Today,".AEDB.CEA.Cox.",ep,".4G.",
                               TRAITS.PROTEIN.RANK[protein],".MODEL2.90days.pdf"), height = 12, width = 10, onefile = TRUE)

    show(summary(cox))

    cat(paste0("\n   > writing the Cox-regression fashizzle to Excel...\n"))

    COX.results.TEMP <- data.frame(matrix(NA, ncol = 12, nrow = 0))
    COX.results.TEMP[1,] = COX.STAT(cox, "AEDB.CEA", ep, TRAITS.PROTEIN.RANK[protein])
    COX.results = rbind(COX.results, COX.results.TEMP)

  }
}

cat("- Edit the column names...\n")
colnames(COX.results) = c("Dataset", "Outcome", "CpG",
                          "Beta", "s.e.m.",
                          "HR", "low95CI", "up95CI",
                          "Z-value", "P-value", "SampleSize", "N_events")

cat("- Correct the variable types...\n")
COX.results$Beta <- as.numeric(COX.results$Beta)
COX.results$s.e.m. <- as.numeric(COX.results$s.e.m.)
COX.results$HR <- as.numeric(COX.results$HR)
COX.results$low95CI <- as.numeric(COX.results$low95CI)
COX.results$up95CI <- as.numeric(COX.results$up95CI)
COX.results$`Z-value` <- as.numeric(COX.results$`Z-value`)
COX.results$`P-value` <- as.numeric(COX.results$`P-value`)
COX.results$SampleSize <- as.numeric(COX.results$SampleSize)
COX.results$N_events <- as.numeric(COX.results$N_events)

AEDB.CEA.COX.results <- COX.results

# Save the data
cat("- Writing results to Excel-file...\n")
head.style <- createStyle(textDecoration = "BOLD")
write.xlsx(AEDB.CEA.COX.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Cox.2G.MODEL2.90days.xlsx"),
           creator = "Sander W. van der Laan",
           sheetName = "Results", headerStyle = head.style,
           row.names = FALSE, col.names = TRUE, overwrite = TRUE)

# Removing intermediates
cat("- Removing intermediate files...\n")
rm(TEMP.DF, protein, fit, cox, coxplot, COX.results, COX.results.TEMP, head.style, AEDB.CEA.COX.results)

rm(head.style)

Correlations

All biomarkers

We correlated plasma and plaque levels of the biomarkers.


# Installation of ggcorrplot()
# --------------------------------
if(!require(devtools)) 
  install.packages("devtools")
devtools::install_github("kassambara/ggcorrplot")
Downloading GitHub repo kassambara/ggcorrplot@master
  
   checking for file ‘/private/var/folders/kc/c5rw4cb94c1c149gsm2ygfc00000gn/T/RtmpGqAtjb/remotesec303149845c/kassambara-ggcorrplot-c46b4cc/DESCRIPTION’ ...
  
✓  checking for file ‘/private/var/folders/kc/c5rw4cb94c1c149gsm2ygfc00000gn/T/RtmpGqAtjb/remotesec303149845c/kassambara-ggcorrplot-c46b4cc/DESCRIPTION’ (339ms)
─  preparing ‘ggcorrplot’:
   checking DESCRIPTION meta-information ...
  
✓  checking DESCRIPTION meta-information

  
─  checking for LF line-endings in source and make files and shell scripts

  
─  checking for empty or unneeded directories
─  building ‘ggcorrplot_0.1.3.999.tar.gz’

  
   
Installing package into ‘/usr/local/lib/R/3.6/site-library’
(as ‘lib’ is unspecified)
* installing *source* package ‘ggcorrplot’ ...
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (ggcorrplot)
library(ggcorrplot)

# Creating matrix - natural log transformed
# --------------------------------
AEDB.CEA.temp <- subset(AEDB.CEA, 
                          select = c("IL6_LN", "MCP1_LN", "IL6_pg_ug_2015_LN", "MCP1_pg_ug_2015_LN", "IL6R_pg_ug_2015_LN",
                                     TRAITS.BIN, TRAITS.CON)
                                    )

AEDB.CEA.temp$CalcificationPlaque <- as.numeric(AEDB.CEA.temp$CalcificationPlaque)
AEDB.CEA.temp$CollagenPlaque <- as.numeric(AEDB.CEA.temp$CollagenPlaque)
AEDB.CEA.temp$Fat10Perc <- as.numeric(AEDB.CEA.temp$Fat10Perc)
AEDB.CEA.temp$IPH <- as.numeric(AEDB.CEA.temp$IPH)
str(AEDB.CEA.temp)
tibble [2,388 × 12] (S3: tbl_df/tbl/data.frame)
 $ IL6_LN             : num [1:2388] 3.97 4.56 4.58 4.93 NA ...
 $ MCP1_LN            : num [1:2388] 3.7 5.53 4.35 4.19 NA ...
 $ IL6_pg_ug_2015_LN  : num [1:2388] -5.23 -7.65 -2 NA NA ...
 $ MCP1_pg_ug_2015_LN : num [1:2388] -0.0505 NA 0.8335 NA NA ...
 $ IL6R_pg_ug_2015_LN : num [1:2388] 0.0893 -8.8939 -0.3091 NA NA ...
 $ CalcificationPlaque: num [1:2388] 1 2 2 2 1 1 2 1 1 2 ...
 $ CollagenPlaque     : num [1:2388] 2 2 2 2 2 2 1 1 2 1 ...
 $ Fat10Perc          : num [1:2388] 2 2 1 1 2 2 2 2 2 2 ...
 $ IPH                : num [1:2388] 2 1 2 2 2 2 2 2 1 2 ...
 $ Macrophages_LN     : num [1:2388] 0.542 -1.732 -1.386 -0.426 -4.605 ...
 $ SMC_LN             : num [1:2388] 1.411 1.833 0.965 0.55 2.239 ...
 $ VesselDensity_LN   : num [1:2388] 0.846 1.203 2.46 2.398 1.541 ...
AEDB.CEA.matrix <- as.matrix(AEDB.CEA.temp)
rm(AEDB.CEA.temp)

corr_biomarkers <- round(cor(AEDB.CEA.matrix, 
                             use = "pairwise.complete.obs", #the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables
                             method = "spearman"), 3)
# corr_biomarkers

corr_biomarkers_p <- ggcorrplot::cor_pmat(AEDB.CEA.matrix, use = "pairwise.complete.obs", method = "spearman")
Cannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with ties
# Add correlation coefficients
# --------------------------------
# argument lab = TRUE
ggcorrplot(corr_biomarkers, 
           method = "square", 
           type = "lower",
           title = "Cross biomarker correlations", 
           show.legend = TRUE, legend.title = bquote("Spearman's"~italic(rho)),
           ggtheme = ggplot2::theme_minimal, outline.color = "#FFFFFF",
           show.diag = TRUE,
           hc.order = FALSE, 
           lab = FALSE,
           digits = 3,
           # p.mat = corr_biomarkers_p, sig.level = 0.05,
           colors = c("#1290D9", "#FFFFFF", "#E55738"))


# Creating matrix - inverse-rank transformation
# --------------------------------
AEDB.CEA.temp <- subset(AEDB.CEA, 
                          select = c("IL6_rank", "MCP1_rank", "IL6_pg_ug_2015_rank", "MCP1_pg_ug_2015_rank", "IL6R_pg_ug_2015_rank",
                                               TRAITS.BIN, TRAITS.CON.RANK)
                                    )

AEDB.CEA.temp$CalcificationPlaque <- as.numeric(AEDB.CEA.temp$CalcificationPlaque)
AEDB.CEA.temp$CollagenPlaque <- as.numeric(AEDB.CEA.temp$CollagenPlaque)
AEDB.CEA.temp$Fat10Perc <- as.numeric(AEDB.CEA.temp$Fat10Perc)
AEDB.CEA.temp$IPH <- as.numeric(AEDB.CEA.temp$IPH)
str(AEDB.CEA.temp)
tibble [2,388 × 12] (S3: tbl_df/tbl/data.frame)
 $ IL6_rank            : num [1:2388] 0.205 0.703 0.746 1.085 NA ...
 $ MCP1_rank           : num [1:2388] -0.944 1.196 -0.297 -0.499 NA ...
 $ IL6_pg_ug_2015_rank : num [1:2388] -1.422 -2.744 0.919 NA NA ...
 $ MCP1_pg_ug_2015_rank: num [1:2388] 0.936 NA 1.691 NA NA ...
 $ IL6R_pg_ug_2015_rank: num [1:2388] 2.21 -2.85 1.78 NA NA ...
 $ CalcificationPlaque : num [1:2388] 1 2 2 2 1 1 2 1 1 2 ...
 $ CollagenPlaque      : num [1:2388] 2 2 2 2 2 2 1 1 2 1 ...
 $ Fat10Perc           : num [1:2388] 2 2 1 1 2 2 2 2 2 2 ...
 $ IPH                 : num [1:2388] 2 1 2 2 2 2 2 2 1 2 ...
 $ Macrophages_rank    : num [1:2388] 1.12 -0.276 -0.105 0.403 -1.414 ...
 $ SMC_rank            : num [1:2388] 1.134 1.678 0.625 0.256 2.086 ...
 $ VesselDensity_rank  : num [1:2388] -0.976 -0.773 0.713 0.609 -0.529 ...
AEDB.CEA.matrix.RANK <- as.matrix(AEDB.CEA.temp)
rm(AEDB.CEA.temp)

corr_biomarkers.rank <- round(cor(AEDB.CEA.matrix.RANK, 
                             use = "pairwise.complete.obs", #the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables
                             method = "spearman"), 3)
# corr_biomarkers.rank

corr_biomarkers_p.rank <- ggcorrplot::cor_pmat(AEDB.CEA.matrix.RANK, use = "pairwise.complete.obs", method = "spearman")
Cannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with tiesCannot compute exact p-value with ties
# Add correlation coefficients
# --------------------------------
# argument lab = TRUE
ggcorrplot(corr_biomarkers.rank, 
           method = "square", 
           type = "lower",
           title = "Cross biomarker correlations", 
           show.legend = TRUE, legend.title = bquote("Spearman's"~italic(rho)),
           ggtheme = ggplot2::theme_minimal, outline.color = "#FFFFFF",
           show.diag = TRUE,
           hc.order = FALSE, 
           lab = FALSE,
           digits = 3,
           # p.mat = corr_biomarkers_p.rank, sig.level = 0.05,
           colors = c("#1290D9", "#FFFFFF", "#E55738"))



# flattenCorrMatrix
# --------------------------------
# cormat : matrix of the correlation coefficients
# pmat : matrix of the correlation p-values
flattenCorrMatrix <- function(cormat, pmat) {
  ut <- upper.tri(cormat)
  data.frame(
    biomarker_row = rownames(cormat)[row(cormat)[ut]],
    biomarker_column = rownames(cormat)[col(cormat)[ut]],
    spearman_cor  =(cormat)[ut],
    pval = pmat[ut]
    )
}

corr_biomarkers.df <- as.data.table(flattenCorrMatrix(corr_biomarkers, corr_biomarkers_p))
DT::datatable(corr_biomarkers.df)


corr_biomarkers.rank.df <- as.data.table(flattenCorrMatrix(corr_biomarkers.rank, corr_biomarkers_p.rank))
DT::datatable(corr_biomarkers.rank.df)


# chart of a correlation matrix
# --------------------------------
# Alternative solution https://www.r-graph-gallery.com/199-correlation-matrix-with-ggally.html
install.packages.auto("PerformanceAnalytics")
Loading required package: PerformanceAnalytics
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘xts’

The following objects are masked from ‘package:data.table’:

    first, last

The following objects are masked from ‘package:dplyr’:

    first, last


Attaching package: ‘PerformanceAnalytics’

The following object is masked from ‘package:graphics’:

    legend
chart.Correlation.new <- function (R, histogram = TRUE, method = c("pearson", "kendall", 
    "spearman"), ...) 
{
    x = checkData(R, method = "matrix")
    if (missing(method)) 
        method = method[1]
    cormeth <- method
    panel.cor <- function(x, y, digits = 2, prefix = "", use = "pairwise.complete.obs", 
        method = cormeth, cex.cor, ...) {
        usr <- par("usr")
        on.exit(par(usr))
        par(usr = c(0, 1, 0, 1))
        r <- cor(x, y, use = use, method = method)
        txt <- format(c(r, 0.123456789), digits = digits)[1]
        txt <- paste(prefix, txt, sep = "")
        if (missing(cex.cor)) 
            cex <- 0.8/strwidth(txt)
        test <- cor.test(as.numeric(x), as.numeric(y), method = method)
        Signif <- symnum(test$p.value, corr = FALSE, na = FALSE, 
            cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), symbols = c("***", 
                "**", "*", ".", " "))
        text(0.5, 0.5, txt, cex = cex * (abs(r) + 0.3)/1.3)
        text(0.8, 0.8, Signif, cex = cex, col = 2)
    }
    f <- function(t) {
        dnorm(t, mean = mean(x), sd = sd.xts(x))
    }
    dotargs <- list(...)
    dotargs$method <- NULL
    rm(method)
    hist.panel = function(x, ... = NULL) {
        par(new = TRUE)
        hist(x, col = "#1290D9", probability = TRUE, axes = FALSE, 
        # hist(x, col = "light gray", probability = TRUE, axes = FALSE, 
            main = "", breaks = "FD")
        lines(density(x, na.rm = TRUE), col = "#E55738", lwd = 1)
        rug(x)
    }
    if (histogram) 
        pairs(x, gap = 0, lower.panel = panel.smooth, upper.panel = panel.cor, 
            diag.panel = hist.panel, ...)
    else pairs(x, gap = 0, lower.panel = panel.smooth, upper.panel = panel.cor, ...)
}

chart.Correlation.new(AEDB.CEA.matrix, method = "spearman", histogram = TRUE, pch = 3)


chart.Correlation.new(AEDB.CEA.matrix.RANK, method = "spearman", histogram = TRUE, pch = 3)



# alternative chart of a correlation matrix
# --------------------------------
# Alternative solution https://www.r-graph-gallery.com/199-correlation-matrix-with-ggally.html
install.packages.auto("GGally")
Loading required package: GGally
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
# Quick display of two cabapilities of GGally, to assess the distribution and correlation of variables 
library(GGally)
 
# From the help page:
ggpairs(AEDB.CEA, 
        columns = c("IL6_rank", "MCP1_rank", "IL6_pg_ug_2015_rank", "MCP1_pg_ug_2015_rank", "IL6R_pg_ug_2015_rank", TRAITS.BIN, TRAITS.CON.RANK), 
        columnLabels = c("IL6 (serum)", "MCP1 (serum)", "IL6", "MCP1", "IL6R",
                         "Calcification", "Collagen", "Fat 10%", "IPH", "Macrophages", "SMC", "Vessel density"),
        method = c("spearman"),
        # ggplot2::aes(colour = Gender),
        progress = FALSE) 
Extra arguments: 'method' are being ignored.  If these are meant to be aesthetics, submit them using the 'mapping' variable within ggpairs with ggplot2::aes or ggplot2::aes_string.

Circulating MCP1

Finally, we explored in a sub-sample, where circulating MCP-1 levels are available, the following:

  1. A correlation between MCP-1 levels in the plaque and circulating MCP-1 levels
  2. Associations of circulating MCP-1 levels with plaque vulnerability characteristics
  3. Associations of circulating MCP-1 levels with the status of the plaque in terms of presence of symptoms (symptomatic vs. asymptomatic)
  4. Associations of circulating MCP-1 levels with the primary composite endpoint of secondary cardiovascular events.

NOT AVAILABLE YET


# Installation of ggcorrplot()
# --------------------------------
if(!require(devtools)) 
  install.packages("devtools")
devtools::install_github("kassambara/ggcorrplot")

library(ggcorrplot)


# Creating matrix - inverse-rank transformation
# --------------------------------
AEDB.CEA.temp <- subset(AEDB.CEA, 
                          select = c("MCP1_rank", 
                                     TRAITS.BIN, TRAITS.CON.RANK, 
                                     "Symptoms.5G", "AsymptSympt", "EP_major", "EP_composite")
                                    )

AEDB.CEA.temp$CalcificationPlaque <- as.numeric(AEDB.CEA.temp$CalcificationPlaque)
AEDB.CEA.temp$CollagenPlaque <- as.numeric(AEDB.CEA.temp$CollagenPlaque)
AEDB.CEA.temp$Fat10Perc <- as.numeric(AEDB.CEA.temp$Fat10Perc)
AEDB.CEA.temp$IPH <- as.numeric(AEDB.CEA.temp$IPH)
AEDB.CEA.temp$Symptoms.5G <- as.numeric(AEDB.CEA.temp$Symptoms.5G)
AEDB.CEA.temp$AsymptSympt <- as.numeric(AEDB.CEA.temp$AsymptSympt)
AEDB.CEA.temp$EP_major <- as.numeric(AEDB.CEA.temp$EP_major)
AEDB.CEA.temp$EP_composite <- as.numeric(AEDB.CEA.temp$EP_composite)
# str(AEDB.CEA.temp)
AEDB.CEA.matrix.plasma.RANK <- as.matrix(AEDB.CEA.temp)
rm(AEDB.CEA.temp)

corr_biomarkers_plasma.rank <- round(cor(AEDB.CEA.matrix.plasma.RANK, 
                             use = "pairwise.complete.obs", #the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables
                             method = "spearman"), 3)
# corr_biomarkers.rank

corr_biomarkers_plasma_p.rank <- ggcorrplot::cor_pmat(AEDB.CEA.matrix.plasma.RANK, use = "pairwise.complete.obs", method = "spearman")

# Add correlation coefficients
# --------------------------------
# argument lab = TRUE
ggcorrplot(corr_biomarkers_plasma.rank, 
           method = "square", 
           type = "lower",
           title = "Cross biomarker correlations", 
           show.legend = TRUE, legend.title = bquote("Spearman's"~italic(rho)),
           ggtheme = ggplot2::theme_minimal, outline.color = "#FFFFFF",
           show.diag = TRUE,
           hc.order = FALSE, 
           lab = FALSE,
           digits = 3,
           # p.mat = corr_biomarkers_plasma_p.rank, sig.level = 0.05,
           colors = c("#1290D9", "#FFFFFF", "#E55738"))


# flattenCorrMatrix
# --------------------------------
# cormat : matrix of the correlation coefficients
# pmat : matrix of the correlation p-values
flattenCorrMatrix <- function(cormat, pmat) {
  ut <- upper.tri(cormat)
  data.frame(
    biomarker_row = rownames(cormat)[row(cormat)[ut]],
    biomarker_column = rownames(cormat)[col(cormat)[ut]],
    spearman_cor  =(cormat)[ut],
    pval = pmat[ut]
    )
}


corr_biomarkers_plasma.rank.df <- as.data.table(flattenCorrMatrix(corr_biomarkers_plasma.rank, corr_biomarkers_plasma_p.rank))
DT::datatable(corr_biomarkers_plasma.rank.df)

# chart of a correlation matrix
# --------------------------------
# Alternative solution https://www.r-graph-gallery.com/199-correlation-matrix-with-ggally.html
install.packages.auto("PerformanceAnalytics")
chart.Correlation.new <- function (R, histogram = TRUE, method = c("pearson", "kendall", 
    "spearman"), ...) 
{
    x = checkData(R, method = "matrix")
    if (missing(method)) 
        method = method[1]
    cormeth <- method
    panel.cor <- function(x, y, digits = 2, prefix = "", use = "pairwise.complete.obs", 
        method = cormeth, cex.cor, ...) {
        usr <- par("usr")
        on.exit(par(usr))
        par(usr = c(0, 1, 0, 1))
        r <- cor(x, y, use = use, method = method)
        txt <- format(c(r, 0.123456789), digits = digits)[1]
        txt <- paste(prefix, txt, sep = "")
        if (missing(cex.cor)) 
            cex <- 0.8/strwidth(txt)
        test <- cor.test(as.numeric(x), as.numeric(y), method = method)
        Signif <- symnum(test$p.value, corr = FALSE, na = FALSE, 
            cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), symbols = c("***", 
                "**", "*", ".", " "))
        text(0.5, 0.5, txt, cex = cex * (abs(r) + 0.3)/1.3)
        text(0.8, 0.8, Signif, cex = cex, col = 2)
    }
    f <- function(t) {
        dnorm(t, mean = mean(x), sd = sd.xts(x))
    }
    dotargs <- list(...)
    dotargs$method <- NULL
    rm(method)
    hist.panel = function(x, ... = NULL) {
        par(new = TRUE)
        hist(x, col = "#1290D9", probability = TRUE, axes = FALSE, 
        # hist(x, col = "light gray", probability = TRUE, axes = FALSE, 
            main = "", breaks = "FD")
        lines(density(x, na.rm = TRUE), col = "#E55738", lwd = 1)
        rug(x)
    }
    if (histogram) 
        pairs(x, gap = 0, lower.panel = panel.smooth, upper.panel = panel.cor, 
            diag.panel = hist.panel, ...)
    else pairs(x, gap = 0, lower.panel = panel.smooth, upper.panel = panel.cor, ...)
}

chart.Correlation.new(AEDB.CEA.matrix.plasma.RANK, method = "spearman", histogram = TRUE, pch = 3)


# alternative chart of a correlation matrix
# --------------------------------
# Alternative solution https://www.r-graph-gallery.com/199-correlation-matrix-with-ggally.html
install.packages.auto("GGally")

# Quick display of two cabapilities of GGally, to assess the distribution and correlation of variables 
library(GGally)
 
# From the help page:
ggpairs(AEDB.CEA,
        columns = c("MCP1_rank", TRAITS.BIN, TRAITS.CON.RANK, "Symptoms.5G", "AsymptSympt", "EP_major", "EP_composite"), 
        columnLabels = c("MCP1 (plasma)", 
                         "Calcification", "Collagen", "Fat 10%", "IPH", "Macrophages", "SMC", "Vessel density",
                         "Symptoms", "Symptoms (grouped)", "MACE", "Composite"),
        method = c("spearman"),
        # ggplot2::aes(colour = Gender),
        progress = FALSE) 

Additional figures

Age and sex

We want to create per-age-group figures.

  • Box and Whisker plot for MCP-1 plaque levels by sex and age group (<55, 55-64, 65-74, 75-84, 85+)
  • Box and Whisker plot for MCP-1 plasma levels by sex and age group (<55, 55-64, 65-74, 75-84, 85+)
  • Scatter plot of the correlation and regression line between MCP-1 levels in plaque (y axis) and plasma (x axis).
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(AgeGroup = factor(case_when(Age < 55 ~ "<55",
                                                     Age >= 55  & Age <= 64 ~ "55-64",
                                                     Age >= 65  & Age <= 74 ~ "65-74",
                                                     Age >= 75  & Age <= 84 ~ "75-84",
                                                     Age >= 85 ~ "85+"))) 

AEDB.CEA <- AEDB.CEA %>% mutate(AgeGroupSex = factor(case_when(Age < 55 & Gender == "male" ~ "<55 males" ,
                                                        Age >= 55  & Age <= 64 & Gender == "male"~ "55-64 males",
                                                        Age >= 65  & Age <= 74 & Gender == "male"~ "65-74 males",
                                                        Age >= 75  & Age <= 84 & Gender == "male"~ "75-84 males",
                                                        Age >= 85 & Gender == "male"~ "85+ males",
                                                        Age < 55 & Gender == "female" ~ "<55 females" ,
                                                        Age >= 55  & Age <= 64 & Gender == "female"~ "55-64 females ",
                                                        Age >= 65  & Age <= 74 & Gender == "female"~ "65-74 females",
                                                        Age >= 75  & Age <= 84 & Gender == "female"~ "75-84 females",
                                                        Age >= 85 & Gender == "female"~ "85+ females")))

table(AEDB.CEA$AgeGroup, AEDB.CEA$Gender)
table(AEDB.CEA$AgeGroupSex)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and age group.

Inverse-rank transformed data

MCP1 plaque levels


# ?ggpubr::ggboxplot()

# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# ?ggpubr::ggboxplot()
ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Hypertension & blood pressure

We want to create figures of MCP1 levels stratified by hypertension/blood pressure, and use of anti-hypertensive drugs.

  • Box and Whisker plot for MCP-1 plaque levels by hypertension group (no, yes)
  • Box and Whisker plot for MCP-1 plasma levels by systolic blood pressure group (<120, 120-139, 140-159,160+)
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(SBPGroup = factor(case_when(systolic < 120 ~ "<120",
                                                     systolic >= 120  & systolic <= 139 ~ "120-139",
                                                     systolic >= 140  & systolic <= 159 ~ "140-159",
                                                     systolic >= 160 ~ "160+"))) 

table(AEDB.CEA$SBPGroup, AEDB.CEA$Gender)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and hypertension/blood pressure group.

Inverse-rank transformed data

MCP1 plaque levels


# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Self-reported hypertension per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), 
                  x = c("Hypertension.selfreport"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Self-reported hypertension per medication use",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET


ggpubr::ggboxplot(AEDB.CEA,
                  x = c("SBPGroup"),
                  y = "MCP1_rank",
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") 

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SBPGroup)), 
                  x = c("SBPGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(Hypertension.selfreport)), 
                  x = c("Hypertension.selfreport"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Self-reported hypertension per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(Hypertension.selfreport) & !is.na(Hypertension.drugs)), 
                  x = c("Hypertension.selfreport"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Self-reported hypertension per medication use",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Hypertension.drugs",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") 

MCP1 plasma levels

NOT AVAILABLE YET


ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("SBPGroup"),
                  y = "MCP1", 
                  xlab = "Systolic blood pressure (mmHg) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Hypercholesterolemia & LDL levels

We want to create figures of MCP1 levels stratified by hypercholesterolemia/LDL-levels, and use of lipid-lowering drugs.

  • Box and Whisker plot for MCP-1 plaque levels by hypercholesterolemia group (no, yes)
  • Box and Whisker plot for MCP-1 plasma levels by LDL-levels (mmol/L) group (<100, 100-129, 130-159, 160-189, 190+)
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(LDLGroup = factor(case_when(LDL_finalCU < 100 ~ "<100",
                                                     LDL_finalCU >= 100  & LDL_finalCU <= 129 ~ "100-129",
                                                     LDL_finalCU >= 130  & LDL_finalCU <= 159 ~ "130-159",
                                                     LDL_finalCU >= 160  & LDL_finalCU <= 189 ~ "160-189",
                                                     LDL_finalCU >= 190 ~ "190+"))) 


table(AEDB.CEA$LDLGroup, AEDB.CEA$Gender)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and hypercholesterolemia/LDL-levels group, as well as stratified by lipid-lowering drugs users.

Inverse-rank transformed data

MCP1 plaque levels


# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), 
                  x = c("LDLGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "LDL (mg/dL) per LLD use",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Med.Statin.LLD",
                  palette = c("#49A01D", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# ?ggpubr::ggboxplot()
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(LDLGroup)), 
                  x = c("LDLGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "LDL (mg/dL) per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(LDLGroup) & !is.na(Med.Statin.LLD)), 
                  x = c("LDLGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "LDL (mg/dL) per LLD use",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Med.Statin.LLD",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Kidney function (eGFR)

We want to create figures of MCP1 levels stratified by kidney function.

  • Box and Whisker plot for MCP-1 plaque levels by chronic kidney disease (CKD) group (1, 2, 3, 4, 5)
  • Box and Whisker plot for MCP-1 plasma levels by eGFR (MDRD-based) group (90+, 60-89, 30-59, <30)
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(eGFRGroup = factor(case_when(GFR_MDRD < 15 ~ "<15",
                                                             GFR_MDRD >= 15  & GFR_MDRD <= 29 ~ "15-29",
                                                             GFR_MDRD >= 30  & GFR_MDRD <= 59 ~ "30-59",
                                                             GFR_MDRD >= 60  & GFR_MDRD <= 89 ~ "60-89",
                                                             GFR_MDRD >= 90 ~ "90+")))

table(AEDB.CEA$eGFRGroup, AEDB.CEA$Gender)

table(AEDB.CEA$eGFRGroup, AEDB.CEA$KDOQI)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and kidney function group.

Inverse-rank transformed data

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "eGFR (mL/min per 1.73 m2) per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Kidney function (KDOQI) per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 
rm(p1)

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), 
                  x = c("eGFRGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "eGFR (mL/min per 1.73 m2) by KDOQI group",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")
rm(p1)

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(eGFRGroup)), 
                  x = c("eGFRGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "eGFR (mL/min per 1.73 m2) per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(KDOQI)), 
                  x = c("KDOQI"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Kidney function (KDOQI) per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1 + rotate_x_text(45), legend = "right") 
rm(p1)

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(eGFRGroup) & !is.na(KDOQI)), 
                  x = c("eGFRGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "eGFR (mL/min per 1.73 m2) by KDOQI group",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "KDOQI",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")
rm(p1)

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

BMI

We want to create figures of MCP1 levels stratified by BMI.

  • Box and Whisker plot for MCP-1 plaque levels by BMI WHO group (underweight, normal, overweight, obese)
  • Box and Whisker plot for MCP-1 plasma levels by BMI group (<18.5, 18.5-24.9, 25, 29.9, 30-24.9, 35+)
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(BMIGroup = factor(case_when(BMI < 18.5 ~ "<18.5",
                                                     BMI >= 18.5  & BMI < 25 ~ "18.5-24",
                                                     BMI >= 25  & BMI < 30 ~ "25-29",
                                                     BMI >= 30  & BMI < 35 ~ "30-35",
                                                     BMI >= 35 ~ "35+"))) 

# require(labelled)
# AEDB.CEA$BMI_US <- as_factor(AEDB.CEA$BMI_US)
# AEDB.CEA$BMI_WHO <- as_factor(AEDB.CEA$BMI_WHO)
# table(AEDB.CEA$BMI_WHO, AEDB.CEA$BMI_US)

table(AEDB.CEA$BMIGroup, AEDB.CEA$Gender)
table(AEDB.CEA$BMIGroup, AEDB.CEA$BMI_WHO)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and age group.

Inverse-rank transformed data

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), 
                  x = c("AgeGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "BMI groups (kg/m2) per WHO categories",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "BMI_WHO",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")
rm(p1)

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "MCP1 plaque [pg/ug]",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup)), 
                  x = c("BMIGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "BMI groups (kg/m2)",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(BMIGroup) & !is.na(BMI_WHO)), 
                  x = c("AgeGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "BMI groups (kg/m2) per WHO categories",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "BMI_WHO",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p1, legend = "right")
rm(p1)

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Diabetes

We want to create figures of MCP1 levels stratified by type 2 diabetes.

  • Box and Whisker plot for MCP-1 plaque levels by type 2 diabetes group (no, yes)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and age group.

Inverse-rank transformed data

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Diabetes status",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Diabetes status per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015 ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Diabetes status",
                  ylab = "MCP1 plaque [pg/ug]",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = c("median_iqr", "jitter")) #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015 ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(DiabetesStatus)), 
                  x = c("DiabetesStatus"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Diabetes status per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Smoking

We want to create figures of MCP1 levels stratified by smoking.

  • Box and Whisker plot for MCP-1 plaque levels by smoking group (never, ex, current)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and age group.

Inverse-rank transformed data

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Smoker status",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9", 
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Smoker status per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015 ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Smoker status",
                  ylab = "MCP1 plaque [pg/ug]",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9", 
                  add = c("median_iqr", "jitter")) #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015 ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(SmokerStatus)), 
                  x = c("SmokerStatus"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Smoker status per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = c("median_iqr", "jitter")) #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Stenosis

We want to create figures of MCP1 levels stratified by stenosis grade.

  • Box and Whisker plot for MCP-1 plaque levels by stenosis grade group (<70, 70-89, 90+)
library(dplyr)

AEDB.CEA <- AEDB.CEA %>% mutate(StenoticGroup = factor(case_when(stenose == "0-49%" ~ "<70",
                                                     stenose == "0-49%" ~ "<70",
                                                     stenose == "50-70%" ~ "<70",
                                                     stenose == "70-90%" ~ "70-89",
                                                     stenose == "50-99%" ~ "90+",
                                                     stenose == "70-99%" ~ "90+",
                                                     stenose == "100% (Occlusion)" ~ "90+",
                                                     stenose == "90-99%" ~ "90+")))

table(AEDB.CEA$StenoticGroup, AEDB.CEA$Gender)
table(AEDB.CEA$stenose, AEDB.CEA$StenoticGroup)

Now we can draw some graphs of plasma/plaque MCP1 levels per sex and age group.

Inverse-rank transformed data

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Stenotic grade",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Stenotic grade per gender",
                  ylab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

# compare_means(MCP1_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("Gender"),
                  y = "MCP1_rank",
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA,
                  x = c("AgeGroup"),
                  y = "MCP1_rank",
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

Raw data

Simalarly but now for the raw data as median ± interquartile range.

MCP1 plaque levels


# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Stenotic grade",
                  ylab = "MCP1 plaque [pg/ug]",
                  # color = "Gender",
                  # palette = c("#D5267B", "#1290D9"),
                  color = "#1290D9",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
ggpubr::ggboxplot(AEDB.CEA %>% filter(!is.na(StenoticGroup)), 
                  x = c("StenoticGroup"),
                  y = "MCP1_pg_ug_2015", 
                  xlab = "Stenotic grade per gender",
                  ylab = "MCP1 plaque [pg/ug]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")

MCP1 plasma levels

NOT AVAILABLE YET

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("Gender"),
                  y = "MCP1", 
                  xlab = "Gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

ggpubr::ggboxplot(AEDB.CEA, 
                  x = c("AgeGroup"),
                  y = "MCP1", 
                  xlab = "Age groups (years) per gender",
                  ylab = "MCP1 plasma [pg/mL]",
                  color = "Gender",
                  palette = c("#D5267B", "#1290D9"),
                  # add = "median_iqr")
                  add = c("median_iqr", "jitter"))

Circulating vs. plaque MCP1 levels

We will also make a nice correlation plot between plasma and plaque MCP1 levels.

NOT AVAILABLE YET


ggpubr::ggscatter(AEDB.CEA, 
                  x = "MCP1_pg_ug_2015",
                  y = "MCP1", 
                  xlab = "MCP1 plaque [pg/ug]",
                  ylab = "MCP1 plasma [pg/mL]",
                  add = "reg.line", add.params = list(color = "#1290D9"),
                  conf.int = TRUE,
                  cor.coef = TRUE, cor.coeff.args = list(method = "spearman"), cor.coef.coord = c(8,750))

ggpubr::ggscatter(AEDB.CEA, 
                  x = "MCP1_pg_ug_2015_rank",
                  y = "MCP1_rank", 
                  xlab = "MCP1 plaque [pg/ug]\n(inverse-rank transformation)",
                  ylab = "MCP1 plasma [pg/mL]\n(inverse-rank transformation)",
                  add = "reg.line", add.params = list(color = "#1290D9"),
                  conf.int = TRUE,
                  cor.coef = TRUE, cor.coeff.args = list(method = "spearman"), cor.coef.coord = c(2,3))

Plaque vs. plaque MCP1 levels

We will also make a nice correlation plot between the two experiments of plaque MCP1 levels.

AEDB.CEA$MCP1_rank <- qnorm((rank(AEDB.CEA$MCP1, na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA$MCP1)))
summary(AEDB.CEA$MCP1)
summary(AEDB.CEA$MCP1_pg_ug_2015)

ggpubr::ggscatter(AEDB.CEA, 
                  x = "MCP1", 
                  y = "MCP1_pg_ug_2015",
                  xlab = "MCP1 plaque [pg/mL] (exp. no. 1)",
                  ylab = "MCP1 plaque [pg/ug] (exp. no. 2)",
                  add = "reg.line", add.params = list(color = "#1290D9"),
                  conf.int = TRUE,
                  cor.coef = TRUE, cor.coeff.args = list(method = "spearman"))

ggpubr::ggscatter(AEDB.CEA, 
                  x = "MCP1_rank", 
                  y = "MCP1_pg_ug_2015_rank",
                  xlab = "MCP1 plaque [pg/mL]\n(INRT,  exp. no. 1)",
                  ylab = "MCP1 plaque [pg/ug]\n(INRT,  exp. no. 2)",
                  add = "reg.line", add.params = list(color = "#1290D9"),
                  conf.int = TRUE,
                  cor.coef = TRUE, cor.coeff.args = list(method = "spearman"))

Symptoms

We want to create per-symptom figures.

library(dplyr)

table(AEDB.CEA$AgeGroup, AEDB.CEA$AsymptSympt2G)
table(AEDB.CEA$Gender, AEDB.CEA$AsymptSympt2G)
table(AEDB.CEA$AsymptSympt2G)

Now we can draw some graphs of plasma/plaque MCP1 levels per symptom group.


# ?ggpubr::ggboxplot()
my_comparisons <- list(c("Asymptomatic", "Symptomatic"))

p1 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "AsymptSympt2G", y = "MCP1_pg_ug_2015_rank",
                  title = "MCP1 plaque [pg/ug] levels per symptom", 
                  xlab = "Symptoms",
                  ylab = "MCP1 plaque [pg/ug]\n inverse-rank transformation",
                  color = "AsymptSympt2G", 
                  palette = c(uithof_color[16], uithof_color[23]),
                  add = "dotplot", # Add dotplot
                  add.params = list(binwidth = 0.1, dotsize = 0.3)
          ) +
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test")
ggpar(p1, legend = c("right"), legend.title = "Symptoms")
p1 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "AsymptSympt2G", y = "MCP1_rank",
                  title = "MCP1 plasma [pg/mL] levels per symptom", 
                  xlab = "Symptoms",
                  ylab = "MCP1 plasma [pg/mL]\n inverse-rank transformation",
                  color = "AsymptSympt2G", 
                  palette = c(uithof_color[16], uithof_color[23]),
                  add = "dotplot", # Add dotplot
                  add.params = list(binwidth = 0.1, dotsize = 0.3)
          ) +
  stat_compare_means(comparisons = my_comparisons, method = "wilcox.test")
ggpar(p1, legend = c("right"), legend.title = "Symptoms")
rm(p1)

Forest plots

We would also like to visualize the multivariable analyses results.

library(ggplot2)
library(openxlsx)
model1_mcp1 <- read.xlsx(paste0(OUT_loc, "/", Today, ".AEDB.CEA.Bin.Uni.Protein.RANK.Symptoms.MODEL1.xlsx"))
model2_mcp1 <- read.xlsx(paste0(OUT_loc, "/", Today, ".AEDB.CEA.Bin.Multi.Protein.RANK.Symptoms.MODEL2.xlsx"))
model1_mcp1$model <- "univariate"
model2_mcp1$model <- "multivariate"

models_mcp1 <- rbind(model1_mcp1, model2_mcp1)
models_mcp1
dat <- data.frame(group = factor(c("Age, sex-adjusted", "Age, sex, and adjusted for risk factors"), 
                           
                           levels=c("Age, sex, and adjusted for risk factors", "Age, sex-adjusted")),
                  cen = c(models_mcp1$OR[models_mcp1$Predictor=="MCP1_pg_ug_2015_rank"]),
                  low = c(models_mcp1$low95CI[models_mcp1$Predictor=="MCP1_pg_ug_2015_rank"]),
                  high = c(models_mcp1$up95CI[models_mcp1$Predictor=="MCP1_pg_ug_2015_rank"]))

fp <- ggplot(data = dat, aes(x = group, y = cen, ymin = low, ymax = high)) +
  geom_pointrange(linetype = 2, size = 1, colour = c("#1290D9", "#49A01D")) + 
  geom_hline(yintercept = 1, lty = 2) +  # add a dotted line at x=1 after flip
  coord_flip(ylim = c(0.8, 1.7)) +  # flip coordinates (puts labels on y axis)
  xlab("Model") + ylab("OR (95% CI) for symptomatic plaques") +
  ggtitle("Plaque MCP-1 levels (1 SD increment)") +
  theme_minimal()  # use a white background
print(fp)

rm(fp)
dat <- data.frame(group = factor(c("Age, sex-adjusted", "Age, sex, and adjusted for risk factors"), 
                           
                           levels=c("Age, sex, and adjusted for risk factors", "Age, sex-adjusted")),
                  cen = c(models_mcp1$OR[models_mcp1$Predictor=="MCP1_rank"]),
                  low = c(models_mcp1$low95CI[models_mcp1$Predictor=="MCP1_rank"]),
                  high = c(models_mcp1$up95CI[models_mcp1$Predictor=="MCP1_rank"]))

fp <- ggplot(data=dat, aes(x=group, y=cen, ymin=low, ymax=high)) +
  geom_pointrange() + 
  geom_hline(yintercept=1, lty=2) +  # add a dotted line at x=1 after flip
  coord_flip() +  # flip coordinates (puts labels on y axis)
  xlab("Model") + ylab("OR (95% CI) for symptomatic plaques") +
  theme(text = element_text(size=14)) +
  ggtitle("plasma MCP-1 levels (1 SD increment)") +
  theme_minimal()  # use a white background
print(fp)
rm(fp)

MCP1 vs. cytokines plaque levels correlations

We will plot the correlations of other cytokine plaque levels to the MCP1 plaque levels. These include:

  • IL2
  • IL4
  • IL5
  • IL6
  • IL8
  • IL9
  • IL10
  • IL12
  • IL13
  • IL21
  • INFG
  • TNFA
  • MIF
  • MCP1
  • MIP1a
  • RANTES
  • MIG
  • IP10
  • Eotaxin1
  • TARC
  • PARC
  • MDC
  • OPG
  • sICAM1
  • VEGFA
  • TGFB

In addition we will look at three metalloproteinases which were measured using an activity assay.

  • MMP2
  • MMP8
  • MMP9

The proteins were measured using FACS and LUMINEX. Given the different platforms used (FACS vs. LUMINEX), we will inverse rank-normalize these variables as well to scale them to the same scale as the MCP1 plaque levels.

We will set the measurements that yielded ‘0’ to NA, as it is unlikely that any protein ever has exactly 0 copies. The ‘0’ yielded during the experiment are due to the limits of the detection.

Prepare data

cytokines <- c("IL2", "IL4", "IL5", "IL6", "IL8", "IL9", "IL10", "IL12", "IL13", "IL21", 
               "INFG", "TNFA", "MIF", "MCP1", "MIP1a", "RANTES", "MIG", "IP10", "Eotaxin1", 
               "TARC", "PARC", "MDC", "OPG", "sICAM1", "VEGFA", "TGFB")
metalloproteinases <- c("MMP2", "MMP8", "MMP9")

# fix names
names(AEDB.CEA)[names(AEDB.CEA) == "VEFGA"] <- "VEGFA"


proteins_of_interest <- c(cytokines, metalloproteinases)

proteins_of_interest_rank = unlist(lapply(proteins_of_interest, paste0, "_rank"))


# make variables numerics()
AEDB.CEA <- AEDB.CEA %>%
  mutate_each(funs(as.numeric), proteins_of_interest)
  
for(PROTEIN in 1:length(proteins_of_interest)){

  # UCORBIOGSAqc$Z <- NULL
  var.temp.rank = proteins_of_interest_rank[PROTEIN]
  var.temp = proteins_of_interest[PROTEIN]
  
  cat(paste0("\nSelecting ", var.temp, " and standardising: ", var.temp.rank,".\n"))
  cat(paste0("* changing ", var.temp, " to numeric.\n"))

  # AEDB.CEA <-  AEDB.CEA %>% mutate(AEDB.CEA[,var.temp] == replace(AEDB.CEA[,var.temp], AEDB.CEA[,var.temp]==0, NA))

  AEDB.CEA[,var.temp][AEDB.CEA[,var.temp]==0.000000]=NA

  cat(paste0("* standardising ", var.temp, 
             " (mean: ",round(mean(!is.na(AEDB.CEA[,var.temp])), digits = 6),
             ", n = ",sum(!is.na(AEDB.CEA[,var.temp])),").\n"))
  
  AEDB.CEA <- AEDB.CEA %>%
      mutate_at(vars(var.temp), 
        # list(Z = ~ (AEDB.CEA[,var.temp] - mean(AEDB.CEA[,var.temp], na.rm = TRUE))/sd(AEDB.CEA[,var.temp], na.rm = TRUE))
        list(RANK = ~ qnorm((rank(AEDB.CEA[,var.temp], na.last = "keep") - 0.5) / sum(!is.na(AEDB.CEA[,var.temp]))))
      )
  # str(UCORBIOGSAqc$Z)
  cat(paste0("* renaming RANK to ", var.temp.rank,".\n"))
  AEDB.CEA[,var.temp.rank] <- NULL
  names(AEDB.CEA)[names(AEDB.CEA) == "RANK"] <- var.temp.rank
}

# rm(var.temp, var.temp.rank)

Visualize transformations

We will just visualize these transformations.

proteins_of_interest_rank_mcp1 <- c("MCP1_pg_ug_2015_rank", "MCP1_pg_ml_2015_rank", proteins_of_interest_rank)

proteins_of_interest_mcp1 <- c("MCP1_pg_ug_2015", "MCP1_pg_ml_2015", proteins_of_interest)

for(PROTEIN in proteins_of_interest_mcp1){
  cat(paste0("Plotting protein ", PROTEIN, ".\n"))
  
  p1 <- ggpubr::gghistogram(AEDB.CEA, PROTEIN,
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = paste0(PROTEIN, " plaque levels"),
                    xlab = "",
                    ggtheme = theme_minimal())
  print(p1)
  
}


for(PROTEIN in proteins_of_interest_rank_mcp1){
  cat(paste0("Plotting protein ", PROTEIN, ".\n"))
  
  p1 <- ggpubr::gghistogram(AEDB.CEA, PROTEIN,
                    # y = "..count..",
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"),
                    add = "mean",
                    # rug = TRUE,
                    # add.params =  list(color = "black", linetype = 2),
                    title = paste0(PROTEIN, " plaque levels"),
                    xlab = "inverse-normal transformation",
                    ggtheme = theme_minimal())
  print(p1)
  
}
  

Correlations

Here we calculate correlations between MCP1_pg_ug_2015 and 28 other cytokines (including MCP1 as measured in experiment 1. We use Spearman’s test, thus, correlations a given in rho. Please note the indications of measurement methods:

  • L: LUMINEX
  • E: ELISA
  • a: activity assay
# Installation of ggcorrplot()
# --------------------------------
if(!require(devtools)) 
  install.packages("devtools")
devtools::install_github("kassambara/ggcorrplot")

library(ggcorrplot)

# Creating matrix - inverse-rank transformation
# --------------------------------
AEDB.CEA.temp <- subset(AEDB.CEA, 
                          select = c(proteins_of_interest_rank_mcp1)
                                    )

# str(AEDB.CEA.temp)
AEDB.CEA.matrix.RANK <- as.matrix(AEDB.CEA.temp)
rm(AEDB.CEA.temp)

corr_biomarkers.rank <- round(cor(AEDB.CEA.matrix.RANK, 
                             use = "pairwise.complete.obs", #the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables
                             method = "spearman"), 3)
# corr_biomarkers.rank

rename_proteins_of_interest_mcp1 <- c("MCP1 (L, exp2, pg/ug)", "MCP1 (L, exp2, pg/mL)", 
                                    "IL2", "IL4", "IL5", "IL6", "IL8", "IL9", "IL10", "IL12", 
                                    "IL13 (L)", "IL21 (L)", 
                                    "INFG", "TNFA", "MIF (L)", 
                                    "MCP1 (L, exp1)", "MIP1a (L)", "RANTES (L)", "MIG (L)", "IP10 (L)", 
                                    "Eotaxin1 (L)", "TARC (L)", "PARC (L)", "MDC (L)", 
                                    "OPG (L)", "sICAM1 (L)", "VEGFA (E)", "TGFB (E)", "MMP2 (a)", "MMP8 (a)", "MMP9 (a)")
colnames(corr_biomarkers.rank) <- c(rename_proteins_of_interest_mcp1)
rownames(corr_biomarkers.rank) <- c(rename_proteins_of_interest_mcp1)

corr_biomarkers_p.rank <- ggcorrplot::cor_pmat(AEDB.CEA.matrix.RANK, use = "pairwise.complete.obs", method = "spearman")

# ++++++++++++++++++++++++++++
# flattenCorrMatrix
# ++++++++++++++++++++++++++++
# cormat : matrix of the correlation coefficients
# pmat : matrix of the correlation p-values
flattenCorrMatrix <- function(cormat, pmat) {
  ut <- upper.tri(cormat)
  data.frame(
    row = rownames(cormat)[row(cormat)[ut]],
    column = rownames(cormat)[col(cormat)[ut]],
    cor  =(cormat)[ut],
    p = pmat[ut]
    )
}

corr_biomarkers.rank.df <- flattenCorrMatrix(corr_biomarkers.rank, corr_biomarkers_p.rank)


names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "row"] <- "Cytokine_X"
names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "column"] <- "CytokineY"
names(corr_biomarkers.rank.df)[names(corr_biomarkers.rank.df) == "cor"] <- "SpearmanRho"

DT::datatable(corr_biomarkers.rank.df)

fwrite(corr_biomarkers.rank.df, file = paste0(OUT_loc, "/",Today,".correlation_cytokines.txt"))
# Add correlation coefficients
# --------------------------------
# argument lab = TRUE
p1 <- ggcorrplot(corr_biomarkers.rank, 
           method = "square", 
           type = "lower",
           title = "Cross biomarker correlations", 
           show.legend = TRUE, legend.title = bquote("Spearman's"~italic(rho)),
           ggtheme = ggplot2::theme_minimal, outline.color = "#FFFFFF",
           show.diag = TRUE,
           hc.order = FALSE, 
           lab = FALSE,
           digits = 3,
           tl.cex = 6,
           # xlab = c("MCP1"),
           # p.mat = corr_biomarkers_p.rank, sig.level = 0.05,
           colors = c("#1290D9", "#FFFFFF", "#E55738"))
p1
ggsave(filename = paste0(PLOT_loc, "/", Today, ".correlation_cytokines.png"), plot = last_plot())
rm(p1)

While visually actractive we are not necessarily interested in the correlations between all the cytokines, rather of MCP1 with other cytokines only.

temp <- subset(corr_biomarkers.rank.df, Cytokine_X == "MCP1 (L, exp2, pg/ug)" )
temp$p_log10 <- -log10(temp$p)
p_threshold <- -log10(0.05/29)
p_threshold
p1 <- ggbarplot(temp, x = "CytokineY", y = "SpearmanRho",
          fill = "CytokineY",               # change fill color by cyl
          # color = "white",            # Set bar border colors to white
          palette = uithof_color,            # jco journal color palett. see ?ggpar
          xlab = "Cytokine",
          ylab = expression("Spearman's"~italic(rho)),
          sort.val = "desc",          # Sort the value in dscending order
          sort.by.groups = FALSE,     # Don't sort inside each group
          x.text.angle = 45, # Rotate vertically x axis texts
          cex = 0.8
          )
ggpar(p1, legend = "bottom", 
      legend.title = "") +
  theme(axis.text.x = element_text(size = 9),
        axis.text.y = element_text(size = 9)) 

rm(p1)

temp <- subset(corr_biomarkers.rank.df, Cytokine_X == "MCP1 (L, exp2, pg/mL)" )
temp$p_log10 <- -log10(temp$p)
p_threshold <- -log10(0.05/29)
p_threshold
p1 <- ggbarplot(temp, x = "CytokineY", y = "SpearmanRho",
          fill = "CytokineY",               # change fill color by cyl
          # color = "white",            # Set bar border colors to white
          palette = uithof_color,            # jco journal color palett. see ?ggpar
          xlab = "Cytokine",
          ylab = expression("Spearman's"~italic(rho)),
          sort.val = "desc",          # Sort the value in dscending order
          sort.by.groups = FALSE,     # Don't sort inside each group
          x.text.angle = 45, # Rotate vertically x axis texts
          cex = 0.8
          )
ggpar(p1, legend = "bottom", 
      legend.title = "") +
  theme(axis.text.x = element_text(size = 9),
        axis.text.y = element_text(size = 9)) 

rm(p1)

Another version - problably not good.


p1 <- ggdotchart(temp, x = "CytokineY", y = "p_log10",
           color = "CytokineY",                                # Color by groups
           palette = uithof_color, # Custom color palette
           xlab = "Cytokine",
           ylab = expression(log[10]~"("~italic(p)~")-value"),
           ylim = c(0, 6),
           sorting = "descending",                       # Sort value in descending order
           add = "segments",                             # Add segments from y = 0 to dots
           rotate = FALSE,                                # Rotate vertically
           # group = "CytokineY",                                # Order by groups
           dot.size = 8,                                 # Large dot size
           label = round(temp$SpearmanRho, digits = 3),                        # Add mpg values as dot labels
           font.label = list(color = "white", size = 8, 
                             vjust = 0.5)                   
           )
ggpar(p1, legend = "bottom", 
      legend.title = "") +
  theme(axis.text.x = element_text(size = 9),
        axis.text.y = element_text(size = 9))

rm(temp, p1)

MCP1 vs. cytokines plaque levels lm()

Model 1

In this model we correct for Age, Gender, and year of surgery.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of plaque cytokines traits as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(proteins_of_interest_rank)) {
    TRAIT = proteins_of_interest_rank[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_year, data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))

    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}
cat("Edit the column names...\n")
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)
DT::datatable(GLM.results)

# Save the data
cat("Writing results to Excel-file...\n")
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Con.Uni.MCP1_Plaque.Cytokines_Plaques.RANK.MODEL1.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Con.Uni.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

Model 2

In this model we correct for Age, Gender, year of surgery, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of plaque cytokines as a function of plasma/plaque MCP1 levels.


GLM.results <- data.frame(matrix(NA, ncol = 15, nrow = 0))
cat("Running linear regression...\n")
for (protein in 1:length(TRAITS.PROTEIN.RANK)) {
  PROTEIN = TRAITS.PROTEIN.RANK[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  for (trait in 1:length(proteins_of_interest_rank)) {
    TRAIT = proteins_of_interest_rank[trait]
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    ### univariate
    fit <- lm(currentDF[,PROTEIN] ~ currentDF[,TRAIT] + Age + Gender + ORdate_year + 
                Hypertension.composite + DiabetesStatus + SmokerStatus + 
                Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
                MedHx_CVD + stenose, 
              data = currentDF)
    model_step <- stepAIC(fit, direction = "both", trace = FALSE)
    print(model_step)
    print(summary(fit))
    
    GLM.results.TEMP <- data.frame(matrix(NA, ncol = 15, nrow = 0))
    GLM.results.TEMP[1,] = GLM.CON(fit, "AEDB.CEA", PROTEIN, TRAIT, verbose = TRUE)
    GLM.results = rbind(GLM.results, GLM.results.TEMP)
  }
}
cat("Edit the column names...\n")
colnames(GLM.results) = c("Dataset", "Predictor", "Trait",
                          "Beta", "s.e.m.",
                          "OR", "low95CI", "up95CI",
                          "T-value", "P-value", "r^2", "r^2_adj", "AE_N", "Model_N", "Perc_Miss")

cat("Correct the variable types...\n")
GLM.results$Beta <- as.numeric(GLM.results$Beta)
GLM.results$s.e.m. <- as.numeric(GLM.results$s.e.m.)
GLM.results$OR <- as.numeric(GLM.results$OR)
GLM.results$low95CI <- as.numeric(GLM.results$low95CI)
GLM.results$up95CI <- as.numeric(GLM.results$up95CI)
GLM.results$`T-value` <- as.numeric(GLM.results$`T-value`)
GLM.results$`P-value` <- as.numeric(GLM.results$`P-value`)
GLM.results$`r^2` <- as.numeric(GLM.results$`r^2`)
GLM.results$`r^2_adj` <- as.numeric(GLM.results$`r^2_adj`)
GLM.results$`AE_N` <- as.numeric(GLM.results$`AE_N`)
GLM.results$`Model_N` <- as.numeric(GLM.results$`Model_N`)
GLM.results$`Perc_Miss` <- as.numeric(GLM.results$`Perc_Miss`)
DT::datatable(GLM.results)

# Save the data
cat("Writing results to Excel-file...\n")
### Univariate
library(openxlsx)
write.xlsx(GLM.results,
           file = paste0(OUT_loc, "/",Today,".AEDB.CEA.Con.Multi.MCP1_Plaque.Cytokines_Plaques.RANK.MODEL2.xlsx"),
           row.names = FALSE, col.names = TRUE, sheetName = "Con.Multi.PlaquePheno")
# Removing intermediates
cat("Removing intermediate files...\n")
rm(TRAIT, trait, currentDF, GLM.results, GLM.results.TEMP, fit, model_step)

MCP1 cytokines plaque levels vs. vulnerability index

Here we calculate the plaque instability/vulnerability index

# Plaque vulnerability

table(AEDB.CEA$Macrophages.bin)
table(AEDB.CEA$Fat.bin_10)
table(AEDB.CEA$Collagen.bin)
table(AEDB.CEA$SMC.bin)
table(AEDB.CEA$IPH.bin)

# SPSS code

# 
# *** syntax- Plaque vulnerability**.
# COMPUTE Macro_instab = -999.
# IF macrophages.bin=2 Macro_instab=1.
# IF macrophages.bin=1 Macro_instab=0.
# EXECUTE.
# 
# COMPUTE Fat10_instab = -999.
# IF Fat.bin_10=2 Fat10_instab=1.
# IF Fat.bin_10=1 Fat10_instab=0.
# EXECUTE.
# 
# COMPUTE coll_instab=-999.
# IF Collagen.bin=2 coll_instab=0.
# IF Collagen.bin=1 coll_instab=1.
# EXECUTE.
# 
# 
# COMPUTE SMC_instab=-999.
# IF SMC.bin=2 SMC_instab=0.
# IF SMC.bin=1 SMC_instab=1.
# EXECUTE.
# 
# COMPUTE IPH_instab=-999.
# IF IPH.bin=0 IPH_instab=0.
# IF IPH.bin=1 IPH_instab=1.
# EXECUTE.
# 
# COMPUTE Instability=Macro_instab + Fat10_instab +  coll_instab + SMC_instab + IPH_instab.
# EXECUTE.

# Fix plaquephenotypes
attach(AEDB.CEA)
# mac instability
AEDB.CEA[,"MAC_Instability"] <- NA
AEDB.CEA$MAC_Instability[Macrophages.bin == -999] <- NA
AEDB.CEA$MAC_Instability[Macrophages.bin == "no/minor"] <- 0
AEDB.CEA$MAC_Instability[Macrophages.bin == "moderate/heavy"] <- 1

# fat instability
AEDB.CEA[,"FAT10_Instability"] <- NA
AEDB.CEA$FAT10_Instability[Fat.bin_10 == -999] <- NA
AEDB.CEA$FAT10_Instability[Fat.bin_10 == " <10%"] <- 0
AEDB.CEA$FAT10_Instability[Fat.bin_10 == " >10%"] <- 1

# col instability 
AEDB.CEA[,"COL_Instability"] <- NA
AEDB.CEA$COL_Instability[Collagen.bin == -999] <- NA
AEDB.CEA$COL_Instability[Collagen.bin == "no/minor"] <- 1
AEDB.CEA$COL_Instability[Collagen.bin == "moderate/heavy"] <- 0

# smc instability
AEDB.CEA[,"SMC_Instability"] <- NA
AEDB.CEA$SMC_Instability[SMC.bin == -999] <- NA
AEDB.CEA$SMC_Instability[SMC.bin == "no/minor"] <- 1
AEDB.CEA$SMC_Instability[SMC.bin == "moderate/heavy"] <- 0

# iph instability
AEDB.CEA[,"IPH_Instability"] <- NA
AEDB.CEA$IPH_Instability[IPH.bin == -999] <- NA
AEDB.CEA$IPH_Instability[IPH.bin == "no"] <- 0
AEDB.CEA$IPH_Instability[IPH.bin == "yes"] <- 1

detach(AEDB.CEA)

table(AEDB.CEA$MAC_Instability, useNA = "ifany")
table(AEDB.CEA$FAT10_Instability, useNA = "ifany")
table(AEDB.CEA$COL_Instability, useNA = "ifany")
table(AEDB.CEA$SMC_Instability, useNA = "ifany")
table(AEDB.CEA$IPH_Instability, useNA = "ifany")

# creating vulnerability index
AEDB.CEA <- AEDB.CEA %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
                                )

table(AEDB.CEA$Plaque_Vulnerability_Index, useNA = "ifany")

# str(AEDB.CEA$Plaque_Vulnerability_Index)

Here we plot the levels of inverse-rank normal transformed MCP1 plaque levels from experiment 1 and 2 to the Plaque vulnerability index.

library(sjlabelled)
attach(AEDB.CEA)
AEDB.CEA$yeartemp <- as.numeric(year(AEDB.CEA$dateok))
AEDB.CEA[,"ORyearGroup"] <- NA
AEDB.CEA$ORyearGroup[yeartemp <= 2007] <- "< 2007"
AEDB.CEA$ORyearGroup[yeartemp > 2007] <- "> 2007"
detach(AEDB.CEA)

table(AEDB.CEA$ORyearGroup, AEDB.CEA$ORdate_year)
# Global test
# compare_means(MCP1_pg_ug_2015_rank ~ Gender,  data = AEDB.CEA, method = "wilcox.test")
p1 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/ug]\n(INT, exp 2)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_pg_ml_2015_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/mL]\n(INT, exp 2)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Plaque vulnerability index")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p3 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/mL]\n(INT, exp 1)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p3, legend = "bottom", legend.title = "Plaque vulnerability index")


p1 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_pg_ug_2015_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/ug]\n(INT, exp 2)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") #+
  # stat_compare_means(method = "wilcox.test")
ggpar(p1, legend = "bottom", legend.title = "Plaque vulnerability index")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p2 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_pg_ml_2015_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/mL]\n(INT, exp 2)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p2, legend = "bottom", legend.title = "Plaque vulnerability index")

# compare_means(MCP1_pg_ug_2015_rank ~ AgeGroup,  data = AEDB.CEA, method = "kruskal.test")
p3 <- ggpubr::ggboxplot(AEDB.CEA, 
                  x = "Plaque_Vulnerability_Index",
                  y = "MCP1_rank", 
                  xlab = "Plaque vulnerability index",
                  ylab = "MCP1 plaque [pg/mL]\n(INT, exp 1)",
                  color = "Plaque_Vulnerability_Index",
                  palette = "npg",
                  facet.by = "ORyearGroup",
                  add = "jitter") #+
  # stat_compare_means(method = "kruskal.test")
ggpar(p3, legend = "bottom", legend.title = "Plaque vulnerability index")

Model 1

In this model we correct for Age, Gender, and year of surgery.

Here we use the inverse-rank normalized data - visually this is more normally distributed.

Analysis of the plaque vulnerability indez as a function of plasma/plaque MCP1 levels.

TRAITS.PROTEIN.RANK.extra = c("MCP1_pg_ug_2015_rank", "MCP1_pg_ml_2015_rank",  "MCP1_rank")

GLM.results <- data.frame(matrix(NA, ncol = 16, nrow = 0))
for (protein in 1:length(TRAITS.PROTEIN.RANK.extra)) {
  PROTEIN = TRAITS.PROTEIN.RANK.extra[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "Plaque_Vulnerability_Index"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M1, ORdate_epoch) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    # table(currentDF$ORdate_year)
    ### univariate
     # + Hypertension.composite + DiabetesStatus + SmokerCurrent + 
     #            Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + 
     #            CAD_history + Stroke_history + Peripheral.interv + stenose
    fit <- polr(currentDF[,TRAIT] ~ currentDF[,PROTEIN] + Age + Gender + ORdate_year, 
              data  =  currentDF, 
              Hess = TRUE)
    print(summary(fit))
    
    ## store table
    (ctable <- coef(summary(fit)))

    ## calculate and store p values
    p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
    
    ## combined table
    print((ctable <- cbind(ctable, "p value" = p)))
  }

Model 2

In this model we correct for Age, Gender, Hypertension status, Diabetes status, current smoker status, lipid-lowering drugs (LLDs), antiplatelet medication, eGFR (MDRD), BMI, MedHx_CVD (combination of CAD history, stroke history, and peripheral interventions), and stenosis..


for (protein in 1:length(TRAITS.PROTEIN.RANK.extra)) {
  PROTEIN = TRAITS.PROTEIN.RANK.extra[protein]
  cat(paste0("\nAnalysis of ",PROTEIN,".\n"))
  TRAIT = "Plaque_Vulnerability_Index"
    cat(paste0("\n- processing ",TRAIT,"\n\n"))
    currentDF <- as.data.frame(AEDB.CEA %>%
      dplyr::select(., PROTEIN, TRAIT, COVARIATES_M2) %>%
      filter(complete.cases(.))) %>%
      filter_if(~is.numeric(.), all_vars(!is.infinite(.)))
    # for debug
    # print(DT::datatable(currentDF))
    # print(nrow(currentDF))
    # print(str(currentDF))
    # print(class(currentDF[,TRAIT]))
    ### univariate

    fit <- polr(as.factor(currentDF[,TRAIT]) ~ currentDF[,PROTEIN] + Age + Gender + ORdate_year + Hypertension.composite + DiabetesStatus + SmokerStatus + Med.Statin.LLD + Med.all.antiplatelet + GFR_MDRD + BMI + MedHx_CVD + stenose, 
              data  =  currentDF, 
              Hess = TRUE)

    print(summary(fit))
    
    ## store table
    (ctable <- coef(summary(fit)))

    ## calculate and store p values
    p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
    
    ## combined table
    print((ctable <- cbind(ctable, "p value" = p)))
  }

Session information


Version:      v1.0.12
Last update:  2020-07-06
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to analyse MCP1 from the Ather-Express Biobank Study.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

**MoSCoW To-Do List**
The things we Must, Should, Could, and Would have given the time we have.
_M_
* ASAP - analysis on plasma based on OLINK platform
* DONE - analysis on the pilot dataset on the OLINK platform, comparing plasma vs. plaque
* DONE - linear regression models (model 1 and model 2) of `MCP1_pg_ug_2015` with cytokines
* DONE - check out the difference between the measuremens of `MCP1` and `MCP1_pg_ug_2015` > `MCP1_pg_ug_2015` and `MCP1_pg_ml_2015` give similar results, `MCP1_pg_ug_2015` is more correct as this is corrected for the total amount of protein in the protein-sample used for the measurement. 
* DONE - double check the plotting of the MACE
* DONE - add the statistics for the correlation of `MCP1_pg_ug_2015` with the cytokines
* DONE - add the comparison between `MCP1`, `MCP1_pg_ml_2015`, and `MCP1_pg_ug_2015`
* DONE - analysis in the context of year of surgery given Van Lammeren _et al._ 
* DONE - add analysis on vulnerability index
* DONE - add analysis on binary and ordinal plaque phenotypes
* DONE - add boxplots of MCP1 levels stratified by confounders/variables

_S_
* DONE prettify forest plot

_C_


_W_


**Changes log**
* v1.0.12 Add boxplots of MCP1 levels stratified by confounder/variables.
* v1.0.11 Add analysis of pilot data comparing OLINK-platform based MCP1 levels in plasma and plaque.
* v1.0.10 Add analyses for all three `MCP1`, `MCP1_pg_ml_2015`, and `MCP1_pg_ug_2015`. Add comparison between `MCP1`, `MCP1_pg_ml_2015`, and `MCP1_pg_ug_2015`. Add (and fixed) ordinal regression. Double checked which measurement to use. 
* v1.0.9 Added linear regression models for MCP1 vs. cytokines plaque levels. Double checked upload of MACE-plots. Added statistics from correlation (heatmap) to txt-file.
* v1.0.8 Fixed error in MCP1 plasma analysis. It turns out the `MCP1` and `MCP1_pg_ug_2015` variables are _both_ measured in plaque, in two separate experiments, exp. no. 1 and exp. no. 2, respectively. 
* v1.0.7 Fixed the per Age-group MCP1 Box plots. Added correlations with other cytokines in plaques.
* v1.0.6 Only analyses and figures that end up in the final manuscript.
* v1.0.5 Update with 30- and 90-days survival.
* v1.0.4 Updated with Cox-regressions.
* v1.0.3 Included more models.
* v1.0.2 Bugs fixed.
* v1.0.1 Extended with linear and logistic regressions.
* v1.0.0 Inital version.

sessionInfo()

Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".sample_selection.RData"))
© 1979-2020 Sander W. van der Laan | s.w.vanderlaan-2[at]umcutrecht.nl | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSAtLSBJTDYgYW5kIE1DUDEgcGxhcXVlIGxldmVscy4iCmF1dGhvcjogJ1tTYW5kZXIgVy4gdmFuIGRlciBMYWFuLCBQaERdKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykgfCBAc3d2YW5kZXJsYWFuOyBNYXJpb3MgR2Vvcmdha2lzOyBSYWluZXIgTWFsaWs7IE1hcnRpbiBEaWNoZ2FucycKZGF0ZTogJ2ByIFN5cy5EYXRlKClgJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNhY2hlOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29sbGFwc2U6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWcuYWxpZ246IGNlbnRlcgogICAgZmlnX2NhcHRpb246IHllcwogICAgZmlnX2hlaWdodDogMTAKICAgIGZpZ19yZXRpbmE6IDIKICAgIGZpZ193aWR0aDogMTIKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKbWFpbmZvbnQ6IEhlbHZldGljYQpzdWJ0aXRsZTogQW4gJ0F0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHknIHByb2plY3QKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0KIyBmdXJ0aGVyIGRlZmluZSBzb21lIGtuaXRyLW9wdGlvbnMuCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgsIGZpZy5wYXRoID0gJ0ZpZ3VyZXMvJywKICAgICAgICAgICAgICAgICAgICAgIGV2YWwgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgojIFByZXBhcmF0aW9uCgpDbGVhbiB0aGUgZW52aXJvbm1lbnQuCmBgYHtyIENsZWFyRW52aXJvbm1lbnQsIGluY2x1ZGUgPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKU2V0IGxvY2F0aW9ucywgYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KYGBge3IgTG9jYWxTeXN0ZW0sIGluY2x1ZGUgPSBGQUxTRX0KIyMjIE9wZXJhdGluZyBTeXN0ZW0gVmVyc2lvbgojIyMgTWFjIFBybwojIFJPT1RfbG9jID0gIi9Wb2x1bWVzL0VsaXRlUHJvUXgyTWVkaWEiCiMgR0VOT01JQ19sb2MgPSAiL1VzZXJzL3N2YW5kZXJsYWFuL2lDbG91ZC9HZW5vbWljcyIKCiMjIyBNYWNCb29rClJPT1RfbG9jID0gIi9Vc2Vycy9zd3ZhbmRlcmxhYW4iCkdFTk9NSUNfbG9jID0gcGFzdGUwKFJPT1RfbG9jLCAiL2lDbG91ZC9HZW5vbWljcyIpCgojIyMgR2VuZXJpYyBMb2NhdGlvbnMKQUVEQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvQUUtQUFBX0dTX0RCcyIpCkxBQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvTGFiQnVzaW5lc3MiKQpSRVNVTFRTID0gcGFzdGUwKFJPT1RfbG9jLCAiL1BMSU5LL2FuYWx5c2VzL2xvb2t1cHMvQUVfMjAxOTA5MTJfMDEwX01ESUNIR0FOU19TV1ZETEFBTl9JTDZfTUNQMSIpClJBV0RBVEEgPSBwYXN0ZTAoUk9PVF9sb2MsICIvUExJTksvX0FFX09SSUdJTkFMUy9BRVNDUk5BL3ByZXBwZWRfZGF0YSIpClBST0pFQ1RfbG9jID0gcGFzdGUwKFJPT1RfbG9jLCAiL1BMSU5LL2FuYWx5c2VzL2xvb2t1cHMvQUVfMjAxOTA5MTJfMDEwX01ESUNIR0FOU19TV1ZETEFBTl9JTDZfTUNQMSIpCgojIyMgU09NRSBWQVJJQUJMRVMgV0UgTkVFRCBET1dOIFRIRSBMSU5FCmNhdCgiXG5EZWZpbmluZyBwaGVub3R5cGVzIGFuZCBkYXRhc2V0cy5cbiIpClBST0pFQ1ROQU1FPSJJTDZNQ1AxIgojIFNVQlBST0pFQ1ROQU1FPSIiCgpjYXQoIlxuQ3JlYXRlIGEgbmV3IGFuYWx5c2lzIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLlxuIikKIyBBbmFseXNpcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiLyIsUFJPSkVDVE5BTUUpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi8iLFBST0pFQ1ROQU1FKSksIAogICAgICAgRkFMU0UpCkFOQUxZU0lTX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiLyIsUFJPSkVDVE5BTUUpCgojIFBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL1BMT1RTIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBGQUxTRSkKUExPVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCIvUExPVFMiKQoKIyBRQyBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIEZBTFNFKQpRQ19sb2MgPSBwYXN0ZTAoUExPVF9sb2MsIi9RQyIpCgojIE91dHB1dCBmaWxlcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpKSwgCiAgICAgICBGQUxTRSkKT1VUX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikKCiMgQ09YIGFuYWx5c2lzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL0NPWCIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvQ09YIikpLCAKICAgICAgIEZBTFNFKQpDT1hfbG9jID0gcGFzdGUwKEFOQUxZU0lTX2xvYywgIi9DT1giKQoKIyBCYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChBTkFMWVNJU19sb2MsICIvQkFTRUxJTkUiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL0JBU0VMSU5FIikpLCAKICAgICAgIEZBTFNFKQpCQVNFTElORV9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCAiL0JBU0VMSU5FIikKCiMgU2FtcGxlIHNlbGVjdGlvbgppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9TRUxFQ1RJT05TIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9TRUxFQ1RJT05TIikpLCAKICAgICAgIEZBTFNFKQpTRUxFQ1RJT05TX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvU0VMRUNUSU9OUyIpCgpjYXQoIlxuU2V0dGluZyB3b3JraW5nIGRpcmVjdG9yeSBhbmQgbGlzdGluZyBpdHMgY29udGVudHMuXG4iKQpzZXR3ZChwYXN0ZTAoUFJPSkVDVF9sb2MpKQpnZXR3ZCgpCmxpc3QuZmlsZXMoKQpgYGAKCkEgcGFja2FnZS1pbnN0YWxsYXRpb24gZnVuY3Rpb24uCmBgYHtyIEZ1bmN0aW9uOiBpbnN0YWxsYXRpb25zLCBpbmNsdWRlID0gRkFMU0V9Cmluc3RhbGwucGFja2FnZXMuYXV0byA8LSBmdW5jdGlvbih4KSB7IAogIHggPC0gYXMuY2hhcmFjdGVyKHN1YnN0aXR1dGUoeCkpIAogIGlmKGlzVFJVRSh4ICVpbiUgLnBhY2thZ2VzKGFsbC5hdmFpbGFibGUgPSBUUlVFKSkpIHsgCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJyZXF1aXJlKFwiJXNcIikiLCB4KSkpCiAgfSBlbHNlIHsgCiAgICAjIFVwZGF0ZSBpbnN0YWxsZWQgcGFja2FnZXMgLSB0aGlzIG1heSBtZWFuIGEgZnVsbCB1cGdyYWRlIG9mIFIsIHdoaWNoIGluIHR1cm4KICAgICMgbWF5IG5vdCBiZSB3YXJyZW50ZWQuIAogICAgIyB1cGRhdGUuaW5zdGFsbC5wYWNrYWdlcy5hdXRvKGFzayA9IEZBTFNFKSAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoImluc3RhbGwucGFja2FnZXMoXCIlc1wiLCBkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9IFwiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnL1wiKSIsIHgpKSkKICB9CiAgaWYoaXNUUlVFKHggJWluJSAucGFja2FnZXMoYWxsLmF2YWlsYWJsZSA9IFRSVUUpKSkgeyAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9IGVsc2UgewogICAgaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIpKQogICAgICBpbnN0YWxsLnBhY2thZ2VzKCJCaW9jTWFuYWdlciIpCiAgICAjIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCkgIyB0aGlzIHdvdWxkIGVudGFpbCB1cGRhdGluZyBpbnN0YWxsZWQgcGFja2FnZXMsIHdoaWNoIGluIHR1cm5lZCBtYXkgbm90IGJlIHdhcnJlbnRlZAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigiQmlvY01hbmFnZXI6Omluc3RhbGwoXCIlc1wiKSIsIHgpKSkKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9Cn0KYGBgCgpMb2FkIHRob3NlIHBhY2thZ2VzLgpgYGB7ciBTZXR0aW5nOiBsb2FkaW5nX3BhY2thZ2VzLCBpbmNsdWRlID0gRkFMU0V9Cmluc3RhbGwucGFja2FnZXMuYXV0bygicmVhZHIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm9wdHBhcnNlIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJ0b29scyIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiZHBseXIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRpZHlyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJuYW5pYXIiKQoKIyBUbyBnZXQgJ2RhdGEudGFibGUnIHdpdGggJ2Z3cml0ZScgdG8gYmUgYWJsZSB0byBkaXJlY3RseSB3cml0ZSBnemlwcGVkLWZpbGVzCiMgUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80Mjc4ODQwMS9pcy1wb3NzaWJsZS10by11c2UtZndyaXRlLWZyb20tZGF0YS10YWJsZS13aXRoLWd6ZmlsZQojIGluc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiLCByZXBvcyA9ICJodHRwczovL1JkYXRhdGFibGUuZ2l0bGFiLmlvL2RhdGEudGFibGUiKQpsaWJyYXJ5KGRhdGEudGFibGUpCgppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRpZHl2ZXJzZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIkRUIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJNQVNTIikKIyBpbnN0YWxsLnBhY2thZ2VzLmF1dG8oIlNldXJhdCIpICMgbGF0ZXN0IHZlcnNpb24KCiMgSW5zdGFsbCB0aGUgZGV2dG9vbHMgcGFja2FnZSBmcm9tIEhhZGxleSBXaWNraGFtCmluc3RhbGwucGFja2FnZXMuYXV0bygnZGV2dG9vbHMnKQoKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJoYXZlbiIpCmluc3RhbGwucGFja2FnZXMuYXV0bygic2psYWJlbGxlZCIpCmluc3RhbGwucGFja2FnZXMuYXV0bygic2pQbG90IikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJsYWJlbGxlZCIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGFibGVvbmUiKQoKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJnZ3B1YnIiKQoKYGBgCgpXZSB3aWxsIGNyZWF0ZSBhIGRhdGVzdGFtcCBhbmQgZGVmaW5lIHRoZSBVdHJlY2h0IFNjaWVuY2UgUGFyayBDb2xvdXIgU2NoZW1lLgpgYGB7ciBTZXR0aW5nOiBDb2xvcnMsIGluY2x1ZGUgPSBGQUxTRX0KClRvZGF5ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlWSVtJWQiKQpUb2RheS5SZXBvcnQgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVBLCAlQiAlZCwgJVkiKQoKIyMjIFV0cmVjaHRTY2llbmNlUGFya0NvbG91cnNTY2hlbWUKIyMjCiMjIyBXZWJzaXRldG9jb252ZXJ0SEVYdG9SR0I6aHR0cDovL2hleC5jb2xvcnJycy5jb20uCiMjIyBGb3Jzb21lZnVuY3Rpb25zeW91c2hvdWxkZGl2aWRldGhlc2VudW1iZXJzYnkyNTUuCiMjIyAKIyMjCU5vLglDb2xvcgkJCSAgICAgIEhFWAkoUkdCKQkJCQkJCSAgICAgICAgICAgICAgQ0hSCQkgIE1BRi9JTkZPCiMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMJMQkgIHllbGxvdwkJCSAgICAjRkJCODIwICgyNTEsMTg0LDMyKQkJCQkgICAgICA9PgkxCQlvciAxLjA+SU5GTwojIyMJMgkgIGdvbGQJCQkgICAgICAjRjU5RDEwICgyNDUsMTU3LDE2KQkJCQkgICAgICA9PgkyCQkKIyMjCTMJICBzYWxtb24JCQkgICAgI0U1NTczOCAoMjI5LDg3LDU2KQkJCQkgICAgICA9PgkzCQlvciAwLjA1PE1BRjwwLjIgb3IgMC40PElORk88MC42CiMjIwk0CSAgZGFya3BpbmsJCSAgICAjREIwMDNGICgoMjE5LDAsNjMpCQkJCSAgICAgID0+CTQJCQojIyMJNQkgIGxpZ2h0cGluawkJICAgICNFMzU0OTMgKDIyNyw4NCwxNDcpCQkJCSAgICAgID0+CTUJCW9yIDAuODxJTkZPPDEuMAojIyMJNgkgIHBpbmsJCQkgICAgICAjRDUyNjdCICgyMTMsMzgsMTIzKQkJCQkgICAgICA9Pgk2CQkKIyMjCTcJICBoYXJkcGluawkJICAgICNDQzAwNzEgKDIwNCwwLDExMykJCQkJICAgICAgPT4JNwkJCiMjIwk4CSAgbGlnaHRwdXJwbGUJICAgICNBODQ0OEEgKDE2OCw2OCwxMzgpCQkJCSAgICAgID0+CTgJCQojIyMJOQkgIHB1cnBsZQkJCSAgICAjOUEzNDgwICgxNTQsNTIsMTI4KQkJCQkgICAgICA9Pgk5CQkKIyMjCTEwCWxhdmVuZGVsCQkgICAgIzhENUI5QSAoMTQxLDkxLDE1NCkJCQkJICAgICAgPT4JMTAJCQojIyMJMTEJYmx1ZXB1cnBsZQkJICAjNzA1Mjk2ICgxMTIsODIsMTUwKQkJCQkgICAgICA9PgkxMQkJCiMjIwkxMglwdXJwbGVibHVlCQkgICM2ODZBQTkgKDEwNCwxMDYsMTY5KQkJCSAgICAgID0+CTEyCQkKIyMjCTEzCWxpZ2h0cHVycGxlYmx1ZQkjNjE3M0FEICg5NywxMTUsMTczLzEwMSwxMjAsMTgwKQk9PgkxMwkJCiMjIwkxNAlzZWFibHVlCQkJICAgICM0QzgxQkYgKDc2LDEyOSwxOTEpCQkJCSAgICAgID0+CTE0CQkKIyMjCTE1CXNreWJsdWUJCQkgICAgIzJGOEJDOSAoNDcsMTM5LDIwMSkJCQkJICAgICAgPT4JMTUJCQojIyMJMTYJYXp1cmJsdWUJCSAgICAjMTI5MEQ5ICgxOCwxNDQsMjE3KQkJCQkgICAgICA9PgkxNgkJb3IgMC4wMTxNQUY8MC4wNSBvciAwLjI8SU5GTzwwLjQKIyMjCTE3CWxpZ2h0YXp1cmJsdWUJICAjMTM5NkQ4ICgxOSwxNTAsMjE2KQkJCQkgICAgICA9PgkxNwkJCiMjIwkxOAlncmVlbmJsdWUJCSAgICAjMTVBNkMxICgyMSwxNjYsMTkzKQkJCQkgICAgICA9PgkxOAkJCiMjIwkxOQlzZWF3ZWVkZ3JlZW4JICAjNUVCMTdGICg5NCwxNzcsMTI3KQkJCQkgICAgICA9PgkxOQkJCiMjIwkyMAl5ZWxsb3dncmVlbgkJICAjODZCODMzICgxMzQsMTg0LDUxKQkJCQkgICAgICA9PgkyMAkJCiMjIwkyMQlsaWdodG1vc3NncmVlbgkjQzVEMjIwICgxOTcsMjEwLDMyKQkJCQkgICAgICA9PgkyMQkJCiMjIwkyMgltb3NzZ3JlZW4JCSAgICAjOUZDMjI4ICgxNTksMTk0LDQwKQkJCQkgICAgICA9PgkyMgkJb3IgTUFGPjAuMjAgb3IgMC42PElORk88MC44CiMjIwkyMwlsaWdodGdyZWVuCSAgCSM3OEIxMTMgKDEyMCwxNzcsMTkpCQkJCSAgICAgID0+CTIzL1gKIyMjCTI0CWdyZWVuCQkJICAgICAgIzQ5QTAxRCAoNzMsMTYwLDI5KQkJCQkgICAgICA9PgkyNC9ZCiMjIwkyNQlncmV5CQkJICAgICAgIzU5NUE1QyAoODksOTAsOTIpCQkJCSAgICAgICAgPT4JMjUvWFkJb3IgTUFGPDAuMDEgb3IgMC4wPElORk88MC4yCiMjIwkyNglsaWdodGdyZXkJCSAgICAjQTJBM0E0CSgxNjIsMTYzLDE2NCkJCQkgICAgICA9PgkyNi9NVAojIyMKIyMjCUFERElUSU9OQUwgQ09MT1JTCiMjIwkyNwltaWRncmV5CQkJI0Q3RDhENwojIyMJMjgJdmVyeWxpZ2h0Z3JleQkjRUNFQ0VDIgojIyMJMjkJd2hpdGUJCQkjRkZGRkZGCiMjIwkzMAlibGFjawkJCSMwMDAwMDAKIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdWl0aG9mX2NvbG9yID0gYygiI0ZCQjgyMCIsIiNGNTlEMTAiLCIjRTU1NzM4IiwiI0RCMDAzRiIsIiNFMzU0OTMiLCIjRDUyNjdCIiwKICAgICAgICAgICAgICAgICAiI0NDMDA3MSIsIiNBODQ0OEEiLCIjOUEzNDgwIiwiIzhENUI5QSIsIiM3MDUyOTYiLCIjNjg2QUE5IiwKICAgICAgICAgICAgICAgICAiIzYxNzNBRCIsIiM0QzgxQkYiLCIjMkY4QkM5IiwiIzEyOTBEOSIsIiMxMzk2RDgiLCIjMTVBNkMxIiwKICAgICAgICAgICAgICAgICAiIzVFQjE3RiIsIiM4NkI4MzMiLCIjQzVEMjIwIiwiIzlGQzIyOCIsIiM3OEIxMTMiLCIjNDlBMDFEIiwKICAgICAgICAgICAgICAgICAiIzU5NUE1QyIsIiNBMkEzQTQiLCAiI0Q3RDhENyIsICIjRUNFQ0VDIiwgIiNGRkZGRkYiLCAiIzAwMDAwMCIpCgp1aXRob2ZfY29sb3JfbGVnZW5kID0gYygiI0ZCQjgyMCIsICIjRjU5RDEwIiwgIiNFNTU3MzgiLCAiI0RCMDAzRiIsICIjRTM1NDkzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNENTI2N0IiLCAiI0NDMDA3MSIsICIjQTg0NDhBIiwgIiM5QTM0ODAiLCAiIzhENUI5QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjNzA1Mjk2IiwgIiM2ODZBQTkiLCAiIzYxNzNBRCIsICIjNEM4MUJGIiwgIiMyRjhCQzkiLAogICAgICAgICAgICAgICAgICAgICAgICAiIzEyOTBEOSIsICIjMTM5NkQ4IiwgIiMxNUE2QzEiLCAiIzVFQjE3RiIsICIjODZCODMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNDNUQyMjAiLCAiIzlGQzIyOCIsICIjNzhCMTEzIiwgIiM0OUEwMUQiLCAiIzU5NUE1QyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjQTJBM0E0IiwgIiNEN0Q4RDciLCAiI0VDRUNFQyIsICIjRkZGRkZGIiwgIiMwMDAwMDAiKQoKI2dncGxvdDIgZGVmYXVsdCBjb2xvciBwYWxldHRlCmdnX2NvbG9yX2h1ZSA8LSBmdW5jdGlvbihuKSB7CiAgaHVlcyA9IHNlcSgxNSwgMzc1LCBsZW5ndGggPSBuICsgMSkKICBoY2woaCA9IGh1ZXMsIGwgPSA2NSwgYyA9IDEwMClbMTpuXQp9CgojIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGAKCgpgYGB7ciBBbmFseXNpcyBGdW5jdGlvbnN9CiMgRnVuY3Rpb24gdG8gZ3JlcCBkYXRhIGZyb20gZ2xtKCkvbG0oKQpHTE0uQ09OIDwtIGZ1bmN0aW9uKGZpdCwgREFUQVNFVCwgeF9uYW1lLCB5LCB2ZXJib3NlPWMoVFJVRSxGQUxTRSkpewogIGNhdCgiQW5hbHl6aW5nIGluIGRhdGFzZXQgJyIsIERBVEFTRVQgLCInIHRoZSBhc3NvY2lhdGlvbiBvZiAnIiwgeF9uYW1lICwiJyB3aXRoICciLCB5ICwiJyAuXG4iKQogIGlmIChucm93KHN1bW1hcnkoZml0KSRjb2VmZmljaWVudHMpID09IDEpIHsKICAgIG91dHB1dCA9IGMoREFUQVNFVCwgeF9uYW1lLCB5LCByZXAoTkEsOCkpCiAgICBjYXQoIk1vZGVsIG5vdCBmaXR0ZWQ7IHByb2JhYmx5IHNpbmd1bGFyLlxuIikKICB9ZWxzZSB7CiAgICBjYXQoIkNvbGxlY3RpbmcgZGF0YS5cblxuIikKICAgIGVmZmVjdHNpemUgPSBzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsMV0KICAgIFNFID0gc3VtbWFyeShmaXQpJGNvZWZmaWNpZW50c1syLDJdCiAgICBPUmVmZmVjdCA9IGV4cChzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsMV0pCiAgICBDSV9sb3cgPSBleHAoZWZmZWN0c2l6ZSAtIDEuOTYgKiBTRSkKICAgIENJX3VwID0gZXhwKGVmZmVjdHNpemUgKyAxLjk2ICogU0UpCiAgICB0dmFsdWUgPSBzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsM10KICAgIHB2YWx1ZSA9IHN1bW1hcnkoZml0KSRjb2VmZmljaWVudHNbMiw0XQogICAgUiA9IHN1bW1hcnkoZml0KSRyLnNxdWFyZWQKICAgIFIuYWRqID0gc3VtbWFyeShmaXQpJGFkai5yLnNxdWFyZWQKICAgIHNhbXBsZV9zaXplID0gbnJvdyhtb2RlbC5mcmFtZShmaXQpKQogICAgQUVfTiA9IEFFREIuQ0VBLnNhbXBsZXNpemUKICAgIFBlcmNfTWlzcyA9IDEwMCAtICgoc2FtcGxlX3NpemUgKiAxMDApL0FFX04pCiAgICAKICAgIG91dHB1dCA9IGMoREFUQVNFVCwgeF9uYW1lLCB5LCBlZmZlY3RzaXplLCBTRSwgT1JlZmZlY3QsIENJX2xvdywgQ0lfdXAsIHR2YWx1ZSwgcHZhbHVlLCBSLCBSLmFkaiwgQUVfTiwgc2FtcGxlX3NpemUsIFBlcmNfTWlzcykKICAgIAogICAgaWYgKHZlcmJvc2UgPT0gVFJVRSkgewogICAgY2F0KCJXZSBoYXZlIGNvbGxlY3RlZCB0aGUgZm9sbG93aW5nIGFuZCBzdW1tYXJpemUgaXQgaW4gYW4gb2JqZWN0OlxuIikKICAgIGNhdCgiRGF0YXNldC4uLi4uLi4uLi4uLi4uLi4uLi46IiwgREFUQVNFVCwgIlxuIikKICAgIGNhdCgiU2NvcmUvRXhwb3N1cmUvYmlvbWFya2VyLi46IiwgeF9uYW1lLCAiXG4iKQogICAgY2F0KCJUcmFpdC9vdXRjb21lLi4uLi4uLi4uLi4uLjoiLCB5LCAiXG4iKQogICAgY2F0KCJFZmZlY3Qgc2l6ZS4uLi4uLi4uLi4uLi4uLjoiLCByb3VuZChlZmZlY3RzaXplLCA2KSwgIlxuIikKICAgIGNhdCgiU3RhbmRhcmQgZXJyb3IuLi4uLi4uLi4uLi46Iiwgcm91bmQoU0UsIDYpLCAiXG4iKQogICAgY2F0KCJPZGRzIHJhdGlvIChlZmZlY3Qgc2l6ZSkuLjoiLCByb3VuZChPUmVmZmVjdCwgMyksICJcbiIpCiAgICBjYXQoIkxvd2VyIDk1JSBDSS4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKENJX2xvdywgMyksICJcbiIpCiAgICBjYXQoIlVwcGVyIDk1JSBDSS4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKENJX3VwLCAzKSwgIlxuIikKICAgIGNhdCgiVC12YWx1ZS4uLi4uLi4uLi4uLi4uLi4uLi46Iiwgcm91bmQodHZhbHVlLCA2KSwgIlxuIikKICAgIGNhdCgiUC12YWx1ZS4uLi4uLi4uLi4uLi4uLi4uLi46Iiwgc2lnbmlmKHB2YWx1ZSwgOCksICJcbiIpCiAgICBjYXQoIlJeMi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKFIsIDYpLCAiXG4iKQogICAgY2F0KCJBZGp1c3RlZCByXjIuLi4uLi4uLi4uLi4uLjoiLCByb3VuZChSLmFkaiwgNiksICJcbiIpCiAgICBjYXQoIlNhbXBsZSBzaXplIG9mIEFFIERCLi4uLi4uOiIsIEFFX04sICJcbiIpCiAgICBjYXQoIlNhbXBsZSBzaXplIG9mIG1vZGVsLi4uLi4uOiIsIHNhbXBsZV9zaXplLCAiXG4iKQogICAgY2F0KCJNaXNzaW5nIGRhdGEgJS4uLi4uLi4uLi4uLjoiLCByb3VuZChQZXJjX01pc3MsIDYpLCAiXG4iKQogICAgfSBlbHNlIHsKICAgICAgY2F0KCJDb2xsZWN0aW5nIGRhdGEgaW4gc3VtbWFyeSBvYmplY3QuXG4iKQogICAgfQogIH0KICByZXR1cm4ob3V0cHV0KQogIHByaW50KG91dHB1dCkKfQoKR0xNLkJJTiA8LSBmdW5jdGlvbihmaXQsIERBVEFTRVQsIHhfbmFtZSwgeSwgdmVyYm9zZT1jKFRSVUUsRkFMU0UpKXsKICBjYXQoIkFuYWx5emluZyBpbiBkYXRhc2V0ICciLCBEQVRBU0VUICwiJyB0aGUgYXNzb2NpYXRpb24gb2YgJyIsIHhfbmFtZSAsIicgd2l0aCAnIiwgeSAsIicgLi4uXG4iKQogIGlmIChucm93KHN1bW1hcnkoZml0KSRjb2VmZmljaWVudHMpID09IDEpIHsKICAgIG91dHB1dCA9IGMoREFUQVNFVCwgeF9uYW1lLCB5LCByZXAoTkEsOSkpCiAgICBjYXQoIk1vZGVsIG5vdCBmaXR0ZWQ7IHByb2JhYmx5IHNpbmd1bGFyLlxuIikKICB9ZWxzZSB7CiAgICBjYXQoIkNvbGxlY3RpbmcgZGF0YS4uLlxuIikKICAgIGVmZmVjdHNpemUgPSBzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsMV0KICAgIFNFID0gc3VtbWFyeShmaXQpJGNvZWZmaWNpZW50c1syLDJdCiAgICBPUmVmZmVjdCA9IGV4cChzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsMV0pCiAgICBDSV9sb3cgPSBleHAoZWZmZWN0c2l6ZSAtIDEuOTYgKiBTRSkKICAgIENJX3VwID0gZXhwKGVmZmVjdHNpemUgKyAxLjk2ICogU0UpCiAgICB6dmFsdWUgPSBzdW1tYXJ5KGZpdCkkY29lZmZpY2llbnRzWzIsM10KICAgIHB2YWx1ZSA9IHN1bW1hcnkoZml0KSRjb2VmZmljaWVudHNbMiw0XQogICAgZGV2IDwtIGZpdCRkZXZpYW5jZQogICAgbnVsbERldiA8LSBmaXQkbnVsbC5kZXZpYW5jZQogICAgbW9kZWxOIDwtIGxlbmd0aChmaXQkZml0dGVkLnZhbHVlcykKICAgIFIubCA8LSAxIC0gZGV2IC8gbnVsbERldgogICAgUi5jcyA8LSAxIC0gZXhwKC0obnVsbERldiAtIGRldikgLyBtb2RlbE4pCiAgICBSLm4gPC0gUi5jcyAvICgxIC0gKGV4cCgtbnVsbERldi9tb2RlbE4pKSkKICAgIHNhbXBsZV9zaXplID0gbnJvdyhtb2RlbC5mcmFtZShmaXQpKQogICAgQUVfTiA9IEFFREIuQ0VBLnNhbXBsZXNpemUKICAgIFBlcmNfTWlzcyA9IDEwMCAtICgoc2FtcGxlX3NpemUgKiAxMDApL0FFX04pCiAgICAKICAgIG91dHB1dCA9IGMoREFUQVNFVCwgeF9uYW1lLCB5LCBlZmZlY3RzaXplLCBTRSwgT1JlZmZlY3QsIENJX2xvdywgQ0lfdXAsIHp2YWx1ZSwgcHZhbHVlLCBSLmwsIFIuY3MsIFIubiwgQUVfTiwgc2FtcGxlX3NpemUsIFBlcmNfTWlzcykKICAgIGlmICh2ZXJib3NlID09IFRSVUUpIHsKICAgIGNhdCgiV2UgaGF2ZSBjb2xsZWN0ZWQgdGhlIGZvbGxvd2luZyBhbmQgc3VtbWFyaXplIGl0IGluIGFuIG9iamVjdDpcbiIpCiAgICBjYXQoIkRhdGFzZXQuLi4uLi4uLi4uLi4uLi4uLi4uOiIsIERBVEFTRVQsICJcbiIpCiAgICBjYXQoIlNjb3JlL0V4cG9zdXJlL2Jpb21hcmtlci4uOiIsIHhfbmFtZSwgIlxuIikKICAgIGNhdCgiVHJhaXQvb3V0Y29tZS4uLi4uLi4uLi4uLi46IiwgeSwgIlxuIikKICAgIGNhdCgiRWZmZWN0IHNpemUuLi4uLi4uLi4uLi4uLi46Iiwgcm91bmQoZWZmZWN0c2l6ZSwgNiksICJcbiIpCiAgICBjYXQoIlN0YW5kYXJkIGVycm9yLi4uLi4uLi4uLi4uOiIsIHJvdW5kKFNFLCA2KSwgIlxuIikKICAgIGNhdCgiT2RkcyByYXRpbyAoZWZmZWN0IHNpemUpLi46Iiwgcm91bmQoT1JlZmZlY3QsIDMpLCAiXG4iKQogICAgY2F0KCJMb3dlciA5NSUgQ0kuLi4uLi4uLi4uLi4uLjoiLCByb3VuZChDSV9sb3csIDMpLCAiXG4iKQogICAgY2F0KCJVcHBlciA5NSUgQ0kuLi4uLi4uLi4uLi4uLjoiLCByb3VuZChDSV91cCwgMyksICJcbiIpCiAgICBjYXQoIlotdmFsdWUuLi4uLi4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKHp2YWx1ZSwgNiksICJcbiIpCiAgICBjYXQoIlAtdmFsdWUuLi4uLi4uLi4uLi4uLi4uLi4uOiIsIHNpZ25pZihwdmFsdWUsIDgpLCAiXG4iKQogICAgY2F0KCJIb3NtZXIgYW5kIExlbWVzaG93IHJeMi4uLjoiLCByb3VuZChSLmwsIDYpLCAiXG4iKQogICAgY2F0KCJDb3ggYW5kIFNuZWxsIHJeMi4uLi4uLi4uLjoiLCByb3VuZChSLmNzLCA2KSwgIlxuIikKICAgIGNhdCgiTmFnZWxrZXJrZSdzIHBzZXVkbyByXjIuLi46Iiwgcm91bmQoUi5uLCA2KSwgIlxuIikKICAgIGNhdCgiU2FtcGxlIHNpemUgb2YgQUUgREIuLi4uLi46IiwgQUVfTiwgIlxuIikKICAgIGNhdCgiU2FtcGxlIHNpemUgb2YgbW9kZWwuLi4uLi46Iiwgc2FtcGxlX3NpemUsICJcbiIpCiAgICBjYXQoIk1pc3NpbmcgZGF0YSAlLi4uLi4uLi4uLi4uOiIsIHJvdW5kKFBlcmNfTWlzcywgNiksICJcbiIpCiAgICB9IGVsc2UgewogICAgICBjYXQoIkNvbGxlY3RpbmcgZGF0YSBpbiBzdW1tYXJ5IG9iamVjdC5cbiIpCiAgICB9CiAgfQogIHJldHVybihvdXRwdXQpCiAgcHJpbnQob3V0cHV0KQp9CmBgYAoKCiMgQmFja2dyb3VuZAoKVXNpbmcgYSBNZW5kZWxpYW4gUmFuZG9taXphdGlvbiBhcHByb2FjaCwgd2UgcmVjZW50bHkgZXhhbWluZWQgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIGNpcmN1bGF0aW5nIGxldmVscyBvZiA0MSBjeXRva2luZXMgYW5kIGdyb3d0aCBmYWN0b3JzIGFuZCB0aGUgcmlzayBvZiBzdHJva2UgaW4gdGhlIE1FR0FTVFJPS0UgR1dBUyBkYXRhc2V0ICg2NywwMDAgc3Ryb2tlIGNhc2VzIGFuZCA0NTAsMDAwIGNvbnRyb2xzKSBhbmQgZm91bmQgTW9ub2N5dGUgY2hlbW9hdHRyYWN0YW50IHByb3RlaW4tMSAoTUNQLTEpIGFzIHRoZSBjeXRva2luZSBzaG93aW5nIHRoZSBzdHJvbmdlc3QgYXNzb2NpYXRpb24gd2l0aCBzdHJva2UsIHBhcnRpY3VsYXJseSBsYXJnZSBhcnRlcnkgYW5kIGNhcmRpb2VtYm9saWMgc3Ryb2tlIChHZW9yZ2FraXMgZXQgYWwuLCAyMDE5YSkuIEdlbmV0aWNhbGx5IGVsZXZhdGVkIE1DUC0xIGxldmVscyB3ZXJlIGFsc28gYXNzb2NpYXRlZCB3aXRoIGEgaGlnaGVyIHJpc2sgb2YgY29yb25hcnkgYXJ0ZXJ5IGRpc2Vhc2UgYW5kIG15b2NhcmRpYWwgaW5mYXJjdGlvbiAoR2Vvcmdha2lzIGV0IGFsLiwgMjAxOWEpLiBGdXJ0aGVyLCBpbiBhIG1ldGEtYW5hbHlzaXMgb2YgNiBvYnNlcnZhdGlvbmFsIHBvcHVsYXRpb24tYmFzZWQgb2YgbG9uZ2l0dWRpbmFsIGNvaG9ydCBzdHVkaWVzIHdlIHJlY2VudGx5IHNob3dlZCB0aGF0IGJhc2VsaW5lIGxldmVscyBvZiBNQ1AtMSB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBhIGhpZ2hlciByaXNrIG9mIGlzY2hlbWljIHN0cm9rZSBvdmVyIGZvbGxvdy11cCAoR2Vvcmdha2lzIGV0IGFsLiwgMjAxOWIpLgpXaGlsZSB0aGVzZSBkYXRhIHN1Z2dlc3QgYSBjZW50cmFsIHJvbGUgb2YgTUNQLTEgaW4gdGhlIHBhdGhvZ2VuZXNpcyBvZiBhdGhlcm9zY2xlcm9zaXMsIGl0IHJlbWFpbnMgdW5rbm93biBpZiBNQ1AtMSBsZXZlbHMgaW4gdGhlIGJsb29kIHJlYWxseSByZWZsZWN0IE1DUC0xIGFjdGl2aXR5LiBNQ1AtMSBpcyBleHByZXNzZWQgaW4gdGhlIGF0aGVyb3NjbGVyb3RpYyBwbGFxdWUgYW5kIGF0dHJhY3RzIG1vbm9jeXRlcyBpbiB0aGUgc3ViZW5kb3RoZWxpYWwgc3BhY2UgKE5lbGtlbiBldCBhbC4sIDE5OTE7IFBhcGFkb3BvdWxvdSBldCBhbC4sIDIwMDg7IFRha2V5YSBldCBhbC4sIDE5OTM7IFdpbGNveCBldCBhbC4sIDE5OTQpLiBUaHVzLCBNQ1AtMSBsZXZlbHMgaW4gdGhlIHBsYXF1ZSBtaWdodCBtb3JlIHN0cm9uZ2x5IHJlZmxlY3QgTUNQLTEgc2lnbmFsaW5nLiBIb3dldmVyLCBpdCByZW1haW5zIHVua25vd24gaWYgTUNQLTEgcGxhcXVlIGxldmVscyBhc3NvY2lhdGUgd2l0aCBwbGFxdWUgdnVsbmVyYWJpbGl0eSBvciByaXNrIG9mIGNhcmRpb3Zhc2N1bGFyIGV2ZW50cy4KCgojIyBPYmplY3RpdmVzCgpBZ2FpbnN0IHRoaXMgYmFja2dyb3VuZCB3ZSBub3cgYWltIHRvIG1ha2UgdXNlIG9mIHRoZSBkYXRhIGZyb20gQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeSB0byBleHBsb3JlIHRoZSBhc3NvY2lhdGlvbnMgb2YgTUNQLTEgcHJvdGVpbiBsZXZlbHMgaW4gdGhlIGF0aGVyb3NjbGVyb3RpYyBwbGFxdWVzIGZyb20gcGF0aWVudHMgdW5kZXJnb2luZyBjYXJvdGlkIGVuZGFydGVyZWN0b215IHdpdGggcGhlbm90eXBlcyBvZiBwbGFxdWUgdnVsbmVyYWJpbGl0eSBhbmQgc2Vjb25kYXJ5IHZhc2N1bGFyIGV2ZW50cyBvdmVyIGEgZm9sbG93LXVwIG9mIHRocmVlIHllYXJzLgoKCiMjIE1ldGhvZHMKCipCbG9vZCoKCk9MSU5LLXBsYXRmb3JtIAoKLSBJTDY6IEludGVybGV1a2luIDYuIEVudHJleiBHZW5lOiAzNTY5LiBPTElOSywgcGxhc21hIDwhLS0gQmVuZGVyIE1lZFN5c3RlbXM7IGNhdC5uci46IEJNUzgxMEZGLiBSZWNhbGN1bGF0ZWQgRkFDUy4gW3BnL21MXSAtLT4KLSBNQ1AxOiBNb25vY3l0ZSBjaGVtb3RhY3RpYyBwcm90ZWluIDEsIE1DUC0xIChDaGVtb2tpbmUgKEMtQyBtb3RpZikgbGlnYW5kIDIsIENDTDIpLiBFbnRyZXogR2VuZTogNjM0Ny4gT0xJTkssIHBsYXNtYSA8IS0tIE1lYXN1cmVkIGF0IHRoZSBXS1ouIFJlY2FsY3VsYXRlZCBMdW1pbmV4LiBbcGcvbUxdIC0tPgoKPiBUSEVTRSBEQVRBIEFSRSBOT1QgQVZBSUxBQkxFIFlFVAoKKlBsYXF1ZSoKCkx1bWluZXgtcGxhdGZvcm0sIG1lYXN1cmVkIGJ5IEx1bWluZXgKCi0gTUNQMTogTW9ub2N5dGUgY2hlbW90YWN0aWMgcHJvdGVpbiAxIChhLmsuYS4gQ0NMMjsgRW50cmV6IEdlbmU6IDYzNDcpIGNvbmNlbnRyYXRpb24gaW4gcGxhcXVlIFtwZy91Z10uIE1lYXN1cmVkIGluIHR3byBleHBlcmltZW50cywgdmFyaWFibGVzIGBNQ1AxYCBhbmQgYE1DUDFfcGdfdWdfMjAxNWAuIFRoZSBsYXR0ZXIgd2FzIGNvcnJlY3RlZCBmb3IgcGxhcXVlIHRvdGFsIHByb3RlaW4gY29uY2VudHJhdGlvbi4KLSBJTDY6IEludGVybGV1a2luZyA2IChJTDY7IEVudHJleiBHZW5lOiAzNTY5KSBjb25jZW50cmF0aW9uIGluIHBsYXF1ZSBbcGcvdWddLgotIElMNlI6IEludGVybGV1a2luZyA2IHJlY2VwdG9yIChJTDZSOyBFbnRyZXogR2VuZTogMzU3MCkgY29uY2VudHJhdGlvbiBpbiBwbGFxdWUgW3BnL3VnXS4KCkZBQ1MgcGxhdGZvcm0KCi0gSUw2OiBJbnRlcmxldWtpbiA2LiBFbnRyZXogR2VuZTogMzU2OS4gQmVuZGVyIE1lZFN5c3RlbXM7IGNhdC5uci46IEJNUzgxMEZGLiBSZWNhbGN1bGF0ZWQgRkFDUy4gW3BnL21MXQoKCiMgTG9hZGluZyBkYXRhCgojIyBDbGluaWNhbCBkYXRhCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCmBgYHtyIExvYWRBRURCfQpyZXF1aXJlKGhhdmVuKQoKIyBBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAxOS0zTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMDIwNzIwMTlfSUNfYWRkZWQuc2F2IikpCkFFREJyYXcgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDIwXzFfTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMTYtMDMtMjAyMC5zYXYiKSkKCmhlYWQoQUVEQnJhdykKYGBgCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIHBsYXF1ZSBwcm90ZWluIG1lYXN1cmVtZW50cyBmcm9tIDIwMTUuCmBgYHtyIExvYWRBRVByb3RlaW5zfQpsaWJyYXJ5KG9wZW54bHN4KQpBRURCX1Byb3RlaW5fMjAxNSA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHBhc3RlMChBRURCX2xvYywgIi9fQUVfUHJvdGVpbnMvQ3l0b2tpbmVzX2FuZF9jaGVtb2tpbmVzXzIwMTUvMjAyMDA2MjlfTVBDRjAxNS0wMDI0Lnhsc3giKSwgc2hlZXQgPSAiZm9yX1NQU1NfUiIpCgpuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSlbbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpID09ICJTYW1wbGVJRCJdIDwtICJTVFVEWV9OVU1CRVIiCgpoZWFkKEFFREJfUHJvdGVpbl8yMDE1KQoKYGBgCgpXZSB3aWxsIG1lcmdlIHRoZXNlIG1lYXN1cmVtZW50cyB0byB0aGUgQUVEQiBmb3IgY29tcGFyaW5nIHBnL3VnIHZzLiBwZy9tTCBtZWFzdXJlbWVudHMgb2YgTUNQMSAtIGFsc28gaW4gcmVsYXRpb24gdG8gcGxhcXVlIHBoZW5vdHlwZXMuIEluIGFkZGl0aW9uIHdlIGhhdmUgbW9yZSBpbmZvcm1hdGlvbiB0aGUgZXhwZXJpbWVudCBhbmQgY2FuIGNvcnJlY3QgZm9yIHRoaXMuCgpgYGB7ciBtZXJnZSBBRURCIGFuZCBQcm90ZWluc30KbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpW25hbWVzKEFFREJfUHJvdGVpbl8yMDE1KSA9PSAiSUw2X3BnX21sIl0gPC0gIklMNl9wZ19tbF8yMDE1IgpuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSlbbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpID09ICJJTDZSX3BnX21sIl0gPC0gIklMNlJfcGdfbWxfMjAxNSIKbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpW25hbWVzKEFFREJfUHJvdGVpbl8yMDE1KSA9PSAiSUw4X3BnX21sIl0gPC0gIklMOF9wZ19tbF8yMDE1IgpuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSlbbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpID09ICJNQ1AxX3BnX21sIl0gPC0gIk1DUDFfcGdfbWxfMjAxNSIKbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpW25hbWVzKEFFREJfUHJvdGVpbl8yMDE1KSA9PSAiUkFOVEVTX3BnX21sIl0gPC0gIlJBTlRFU19wZ19tbF8yMDE1IgpuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSlbbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpID09ICJQQUkxX3BnX21sIl0gPC0gIlBBSTFfcGdfbWxfMjAxNSIKbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpW25hbWVzKEFFREJfUHJvdGVpbl8yMDE1KSA9PSAiTUNTRl9wZ19tbCJdIDwtICJNQ1NGX3BnX21sXzIwMTUiCm5hbWVzKEFFREJfUHJvdGVpbl8yMDE1KVtuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSkgPT0gIkFkaXBvbmVjdGluX25nX21sIl0gPC0gIkFkaXBvbmVjdGluX25nX21sXzIwMTUiCm5hbWVzKEFFREJfUHJvdGVpbl8yMDE1KVtuYW1lcyhBRURCX1Byb3RlaW5fMjAxNSkgPT0gIlNlZ21lbnRfaXNvbGF0ZWRfVHJpcyJdIDwtICJTZWdtZW50X2lzb2xhdGVkX1RyaXNfMjAxNSIKbmFtZXMoQUVEQl9Qcm90ZWluXzIwMTUpW25hbWVzKEFFREJfUHJvdGVpbl8yMDE1KSA9PSAiVHJpc19wcm90ZWluX2NvbmNfdWdfbWwiXSA8LSAiVHJpc19wcm90ZWluX2NvbmNfdWdfbWxfMjAxNSIKCnRlbXAgPC0gc3Vic2V0KEFFREJfUHJvdGVpbl8yMDE1LCBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiSUw2X3BnX21sXzIwMTUiLCAiSUw2Ul9wZ19tbF8yMDE1IiwgIklMOF9wZ19tbF8yMDE1IiwgIk1DUDFfcGdfbWxfMjAxNSIsICJSQU5URVNfcGdfbWxfMjAxNSIsICJQQUkxX3BnX21sXzIwMTUiLCAiTUNTRl9wZ19tbF8yMDE1IiwgIkFkaXBvbmVjdGluX25nX21sXzIwMTUiLCAiU2VnbWVudF9pc29sYXRlZF9UcmlzXzIwMTUiLCAiVHJpc19wcm90ZWluX2NvbmNfdWdfbWxfMjAxNSIpKQoKQUVEQiA8LSBtZXJnZShBRURCcmF3LCB0ZW1wLCBieS54ID0gIlNUVURZX05VTUJFUiIsIGJ5LnkgPSAiU1RVRFlfTlVNQkVSIiwgc29ydCA9IEZBTFNFLAogICAgICAgICAgICAgIGFsbC54ID0gVFJVRSkKcm0odGVtcCkKCnRlbXAgPC0gc3Vic2V0KEFFREIsIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJNQ1AxIiwgIk1DUDFfcGdfdWdfMjAxNSIsICJNQ1AxX3BnX21sXzIwMTUiLCAiU2VnbWVudF9pc29sYXRlZF9UcmlzXzIwMTUiKSkKCmhlYWQodGVtcCkKICAgCmBgYAoKIyMjIyBFeGFtaW5lIEFFREIKCldlIGNhbiBleGFtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBkYXRhc2V0IHRvIGtub3cgd2hhdCBlYWNoIHZhcmlhYmxlIGlzIGNhbGxlZCwgd2hhdCBjbGFzcyAodHlwZSkgaXQgaGFzLCBhbmQgd2hhdCB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb24gaXMuIAoKVGhlcmUgaXMgYW4gZXhjZWxsZW50IHBvc3Qgb24gdGhpczogaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vd29ya2luZy13aXRoLXNwc3MtbGFiZWxzLWluLXIvLiAKYGBge3IgQUVEQjogZGVzY3JpYmV9CkFFREIgJT4lIHNqUGxvdDo6dmlld19kZihzaG93LnR5cGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5mcnEgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5wcmMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5uYSA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4LmxlbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgd3JhcC5sYWJlbHMgPSAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2Uudmlld2VyID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVEQi5kaWN0aW9uYXJ5Lmh0bWwiKSkgCmBgYAoKCiMjIEZpeGluZyBhbmQgY3JlYXRpbmcgdmFyaWFibGVzCgpXZSBuZWVkIHRvIGJlIHZlcnkgc3RyaWN0IGluIGRlZmluaW5nIF9zeW1wdG9tcy5fIFRoZXJlZm9yZSB3ZSB3aWxsIGZpeCBhIG5ldyB2YXJpYWJsZSB0aGF0IGdyb3VwcyBfc3ltcHRvbXNfIGF0IGluY2x1c2lvbi4KCkNvZGluZyBvZiBfc3ltcHRvbXNfIGlzIGFzIGZvbGxvd3M6CgotIG1pc3NpbmcJLTk5OQkKLSBBc3ltcHRvbWF0aWMJMAkKLSBUSUEJMQkKLSBtaW5vciBzdHJva2UJMgkKLSBNYWpvciBzdHJva2UJMwkKLSBBbWF1cm9zaXMgZnVnYXgJNAkKLSBGb3VyIHZlc3NlbCBkaXNlYXNlCTUJCi0gVmVydGVicm9iYXNpbGFyeSBUSUEJNwkKLSBSZXRpbmFsIGluZmFyY3Rpb24JOAkKLSBTeW1wdG9tYXRpYywgYnV0IGFzcGVjaWZpYyBzeW10b21zCTkKLSBDb250cmFsYXRlcmFsIHN5bXB0b21hdGljIG9jY2x1c2lvbgkxMAkKLSByZXRpbmFsIGluZmFyY3Rpb24JMTEJCi0gYXJtY2xhdWRpY2F0aW9uIGR1ZSB0byBvY2NsdXNpb24gc3ViY2xhdmlhbiBhcnRlcnksIENFQSBuZWVkZWQgZm9yIGJ5cGFzcwkxMgkKLSByZXRpbmFsIGluZmFyY3Rpb24gKyBUSUFzCTEzCQotIE9jdWxhciBpc2NoZW1pYyBzeW5kcm9tZQkxNAkKLSBpc2NoZW1pc2NoIGdsYXVjb29tCTE1CQotIHN1YmNsYXZpYW4gc3RlYWwgc3luZHJvbWUJMTYJCi0gVEdBCTE3CgpXZSB3aWxsIGdyb3VwIGFzIGZvbGxvd3MgaW4gYFN5bXB0b21zLjVHYDoKCjEuIEFzeW1wdG9tYXRpYyA+IDAKMi4gVElBID4gMSwgNywgMTMKMy4gU3Ryb2tlID4gMiwgMwo0LiBPY3VsYXIgPiA0LCAxNCwgMTUKNS4gUmV0aW5hbCBpbmZhcmN0aW9uID4gOCwgMTEKNi4gT3RoZXIgPiA1LCA5LCAxMCwgMTIsIDE2LCAxNwoKV2Ugd2lsbCBhbHNvIGdyb3VwIGFzIGZvbGxvd3MgaW4gYEFzeW1wdFN5bXB0YDoKCjEuIEFzeW1wdG9tYXRpYyA+IDAKMi4gVElBID4gMSwgNywgMTMgKyBTdHJva2UgPiAyLCAzIAozLiBPY3VsYXIgPiA0LCAxNCwgMTUgKyBSZXRpbmFsIGluZmFyY3Rpb24gPiA4LCAxMSArIE90aGVyID4gNSwgOSwgMTAsIDEyLCAxNiwgMTcKCldlIHdpbGwgYWxzbyBncm91cCBhcyBmb2xsb3dzIGluIGBBc3ltcHRTeW1wdDJHYDoKCjEuIEFzeW1wdG9tYXRpYyA+IDAKMi4gVElBID4gMSwgNywgMTMgKyBTdHJva2UgPiAyLCAzIE9jdWxhciA+IDQsIDE0LCAxNSArIFJldGluYWwgaW5mYXJjdGlvbiA+IDgsIDExICsgT3RoZXIgPiA1LCA5LCAxMCwgMTIsIDE2LCAxNwoKCmBgYHtyIEZpeFN5bXB0b21zLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEZpeCBzeW1wdG9tcwoKYXR0YWNoKEFFREIpCgpBRURCJHN5bXB0W2lzLm5hKEFFREIkc3ltcHQpXSA8LSAtOTk5CgojIFN5bXB0b21zLjVHCkFFREJbLCJTeW1wdG9tcy41RyJdIDwtIE5BCiMgQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAiTkEiXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzXSA8LSAiVElBIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDIgfCBzeW1wdCA9PSAzXSA8LSAiU3Ryb2tlIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDQgfCBzeW1wdCA9PSAxNCB8IHN5bXB0ID09IDE1IF0gPC0gIk9jdWxhciIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA4IHwgc3ltcHQgPT0gMTFdIDwtICJSZXRpbmFsIGluZmFyY3Rpb24iCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNSB8IHN5bXB0ID09IDkgfCBzeW1wdCA9PSAxMCB8IHN5bXB0ID09IDEyIHwgc3ltcHQgPT0gMTYgfCBzeW1wdCA9PSAxN10gPC0gIk90aGVyIgoKIyBBc3ltcHRTeW1wdApBRURCWywiQXN5bXB0U3ltcHQiXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJPY3VsYXIgYW5kIG90aGVycyIKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0MkciXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDMgfCBzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJTeW1wdG9tYXRpYyIKCmRldGFjaChBRURCKQoKIyB0YWJsZShBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQojIAojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCBBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyB0YWJsZShBRURCLnRlbXAkU3ltcHRvbXMuNUcsIEFFREIudGVtcCRBc3ltcHRTeW1wdCkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggdGhlIF9wbGFxdWVwaGVub3R5cGVzXyB2YXJpYWJsZS4gIAoKQ29kaW5nIG9mIHN5bXB0b21zIGlzIGFzIGZvbGxvd3M6CgotIG1pc3NpbmcJLTk5OQkKLSBub3QgcmVsZXZhbnQgLTg4OAotIGZpYnJvdXMJMQkKLSBmaWJyb2F0aGVyb21hdG91cwkyCQotIGF0aGVyb21hdG91cwkzCQoKCmBgYHtyIEZpeFBsYXF1ZVBoZW5vdHlwZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBwbGFxdWVwaGVub3R5cGVzCmF0dGFjaChBRURCKQpBRURCWywiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSJdIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gLTk5OV0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDFdIDwtICJmaWJyb3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDJdIDwtICJmaWJyb2F0aGVyb21hdG91cyIKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAzXSA8LSAiYXRoZXJvbWF0b3VzIgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJwbGFxdWVwaGVub3R5cGUiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgX2RpYWJldGVzXyBzdGF0dXMgdmFyaWFibGUuIFdlIGRlZmluZSBkaWFiZXRlcyBhcyBoaXN0b3J5IG9mIGEgZGlhZ25vc2lzIGFuZC9vciB1c2Ugb2YgZ2x1Y29zZS1sb3dlcmluZyBtZWRpY2F0aW9ucy4KCmBgYHtyIEZpeERpYWJldGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkRpYWJldGVzU3RhdHVzIl0gPC0gTkEKQUVEQiREaWFiZXRlc1N0YXR1c1tETS5jb21wb3NpdGUgPT0gLTk5OV0gPC0gTkEKQUVEQiREaWFiZXRlc1N0YXR1c1tETS5jb21wb3NpdGUgPT0gMF0gPC0gIkNvbnRyb2wgKG5vIERpYWJldGVzIER4L01lZCkiCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IDFdIDwtICJEaWFiZXRlcyIKZGV0YWNoKEFFREIpCgp0YWJsZShBRURCJERNLmNvbXBvc2l0ZSkKCnRhYmxlKEFFREIkRGlhYmV0ZXNTdGF0dXMpCgoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgIkRNLmNvbXBvc2l0ZSIsICJEaWFiZXRlc1N0YXR1cyIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIudGVtcCREaWFiZXRlc1N0YXR1cykKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCmBgYAoKCldlIHdpbGwgYWxzbyBmaXggdGhlIF9zbW9raW5nXyBzdGF0dXMgdmFyaWFibGUuIFdlIGFyZSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgc29tZW9uZSBuZXZlciwgZXZlciBvciBpcyBjdXJyZW50bHkgKGF0IHRoZSB0aW1lIG9mIGluY2x1c2lvbikgc21va2luZy4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgcXVlc3Rpb25uYWlyZS4gCgotIGBkaWV0ODAxYDogYXJlIHlvdSBhIHNtb2tlcj8KLSBgZGlldDgwMmA6IGRpZCB5b3Ugc21va2UgaW4gdGhlIHBhc3Q/CgpXZSBhbHJlYWR5IGhhdmUgc29tZSB2YXJpYWJsZXMgaW5kaWNhdGluZyBzbW9raW5nIHN0YXR1czoKCi0gYFNtb2tpbmdSZXBvcnRlZGA6IHBhdGllbnQgaGFzIHJlcG9ydGVkIHRvIHNtb2tlLgotIGBTbW9raW5nWWVhck9SYDogc21va2luZyBpbiB0aGUgeWVhciBvZiBzdXJnZXJ5PwotIGBTbW9rZXJDdXJyZW50YDogY3VycmVudGx5IHNtb2tpbmc/CgoKCmBgYHtyIEZpeFNtb2tpbmcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJlcXVpcmUobGFiZWxsZWQpCkFFREIkZGlldDgwMSA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODAxKQpBRURCJGRpZXQ4MDIgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwMikKQUVEQiRkaWV0ODA1IDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDUpCkFFREIkU21va2luZ1JlcG9ydGVkIDwtIHRvX2ZhY3RvcihBRURCJFNtb2tpbmdSZXBvcnRlZCkKQUVEQiRTbW9rZXJDdXJyZW50IDwtIHRvX2ZhY3RvcihBRURCJFNtb2tlckN1cnJlbnQpCkFFREIkU21va2luZ1llYXJPUiA8LSB0b19mYWN0b3IoQUVEQiRTbW9raW5nWWVhck9SKQoKIyB0YWJsZShBRURCJGRpZXQ4MDEpCiMgdGFibGUoQUVEQiRkaWV0ODAyKQojIHRhYmxlKEFFREIkU21va2luZ1JlcG9ydGVkKQojIHRhYmxlKEFFREIkU21va2VyQ3VycmVudCkKIyB0YWJsZShBRURCJFNtb2tpbmdZZWFyT1IpCiMgdGFibGUoQUVEQiRTbW9raW5nUmVwb3J0ZWQsIEFFREIkU21va2VyQ3VycmVudCwgdXNlTkEgPSAiaWZhbnkiLCBkbm4gPSBjKCJSZXBvcnRlZCBzbW9raW5nIiwgIkN1cnJlbnQgc21va2VyIikpCiMgCiMgdGFibGUoQUVEQiRkaWV0ODAxLCBBRURCJGRpZXQ4MDIsIHVzZU5BID0gImlmYW55IiwgZG5uID0gYygiU21va2VyIiwgIlBhc3Qgc21va2VyIikpCgpjYXQoIlxuRml4aW5nIHNtb2tpbmcgc3RhdHVzLlxuIikKYXR0YWNoKEFFREIpCkFFREJbLCJTbW9rZXJTdGF0dXMiXSA8LSBOQQpBRURCJFNtb2tlclN0YXR1c1tkaWV0ODAyID09ICJkb24ndCBrbm93Il0gPC0gIk5ldmVyIHNtb2tlZCIKQUVEQiRTbW9rZXJTdGF0dXNbZGlldDgwMiA9PSAiSSBzdGlsbCBzbW9rZSJdIDwtICJDdXJyZW50IHNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8iICYgZGlldDgwMiA9PSAibm8iXSA8LSAiTmV2ZXIgc21va2VkIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyIgJiBkaWV0ODAyID09ICJ5ZXMiXSA8LSAiRXgtc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJ5ZXMiXSA8LSAiQ3VycmVudCBzbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIGRhdGEgYXZhaWxhYmxlL21pc3NpbmciXSA8LSBOQQojIEFFREIkU21va2VyU3RhdHVzW2lzLm5hKFNtb2tlckN1cnJlbnQpXSA8LSAiTmV2ZXIgc21va2VkIgpkZXRhY2goQUVEQikKCmNhdCgiXG4qIEN1cnJlbnQgc21va2luZyBzdGF0dXMuXG4iKQp0YWJsZShBRURCJFNtb2tlckN1cnJlbnQsCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIkN1cnJlbnQgc21va2VyIikpCgpjYXQoIlxuKiBVcGRhdGVkIHNtb2tpbmcgc3RhdHVzLlxuIikKdGFibGUoQUVEQiRTbW9rZXJTdGF0dXMsCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIlVwZGF0ZWQgc21va2luZyBzdGF0dXMiKSkKCmNhdCgiXG4qIENvbXBhcmluZyB0byAnU21va2VyQ3VycmVudCcuXG4iKQp0YWJsZShBRURCJFNtb2tlclN0YXR1cywgQUVEQiRTbW9rZXJDdXJyZW50LCAKICAgICAgdXNlTkEgPSAiaWZhbnkiLCAKICAgICAgZG5uID0gYygiVXBkYXRlZCBzbW9raW5nIHN0YXR1cyIsICJDdXJyZW50IHNtb2tlciIpKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgIkRNLmNvbXBvc2l0ZSIsICJEaWFiZXRlc1N0YXR1cyIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIudGVtcCREaWFiZXRlc1N0YXR1cykKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggdGhlIF9hbGNvaG9sXyBzdGF0dXMgdmFyaWFibGUuCgpgYGB7ciBGaXhBbGNvaG9sLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggZGlhYmV0ZXMKYXR0YWNoKEFFREIpCkFFREJbLCJBbGNvaG9sVXNlIl0gPC0gTkEKQUVEQiRBbGNvaG9sVXNlW2RpZXQ4MTAgPT0gLTk5OV0gPC0gTkEKQUVEQiRBbGNvaG9sVXNlW2RpZXQ4MTAgPT0gMF0gPC0gIk5vIgpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAxXSA8LSAiWWVzIgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkQWxjb2hvbFVzZSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJkaWV0ODEwIiwgIkFsY29ob2xVc2UiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBbGNvaG9sVXNlKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCBhIGhpc3Rvcnkgb2YgQ0FELCBzdHJva2Ugb3IgcGVyaXBoZXJhbCBpbnRlcnZlbnRpb24gc3RhdHVzIHZhcmlhYmxlLiBUaGlzIHdpbGwgYmUgYmFzZWQgb24gYENBRF9oaXN0b3J5YCwgYFN0cm9rZV9oaXN0b3J5YCwgYW5kIGBQZXJpcGhlcmFsLmludGVydmAKCmBgYHtyIEZpeENBRF9IaXN0b3J5LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggZGlhYmV0ZXMKYXR0YWNoKEFFREIpCkFFREJbLCJNZWRIeF9DVkQiXSA8LSBOQQpBRURCJE1lZEh4X0NWRFtDQURfaGlzdG9yeSA9PSAwIHwgU3Ryb2tlX2hpc3RvcnkgPT0gMCB8IFBlcmlwaGVyYWwuaW50ZXJ2ID09IDBdIDwtICJObyIKQUVEQiRNZWRIeF9DVkRbQ0FEX2hpc3RvcnkgPT0gMSB8IFN0cm9rZV9oaXN0b3J5ID09IDEgfCBQZXJpcGhlcmFsLmludGVydiA9PSAxXSA8LSAieWVzIgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkQ0FEX2hpc3RvcnkpCnRhYmxlKEFFREIkU3Ryb2tlX2hpc3RvcnkpCnRhYmxlKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCnRhYmxlKEFFREIkTWVkSHhfQ1ZEKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgoKCgojIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkKCiMjIEJhc2VsaW5lIGNoYXJhY3RlcmlzdGljcwoKV2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXQgYmFzZWxpbmUuCgotIEFnZSAoeWVhcnMpCi0gRmVtYWxlIHNleCAoTiwgJSkKLSBIeXBlcnRlbnNpb24gKE4sICUpCi0gU0JQIChtbUhnKQotIERCUCAobW1IZykKLSBEaWFiZXRlcyBtZWxsaXR1cyAoTiwgJSkKLSBUb3RhbCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQotIExETCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQotIEhETCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQotIFRyaWdseWNlcmlkZSBsZXZlbHMgKG1nL2RMKQotIFVzZSBvZiBzdGF0aW5zIChOLCAlKQotIFVzZSBvZiBhbnRpcGxhdGVsZXQgZHJ1Z3MgKE4sICUpCi0gQk1JIChrZy9twrIpCi0gU21va2luZyBzdGF0dXMgKE4sICUpCiAgLSBOZXZlciBzbW9rZXJzCiAgLSBFeC1zbW9rZXJzCiAgLSBDdXJyZW50IHNtb2tlcnMKLSBIaXN0b3J5IG9mIENBRCAoTiwgJSkKLSBIaXN0b3J5IG9mIFBBRCAoTiwgJSkKLSBDbGluaWNhbCBtYW5pZmVzdGF0aW9ucwogIC0gQXN5bXB0b21hdGljCiAgLSBBbWF1cm9zaXMgZnVnYXgKICAtIFRJQQogIC0gU3Ryb2tlCi0gZUdGUiAobUwvbWluLzEuNzMgbcKyKQotIE1DUC0xIHBsYXF1ZSBsZXZlbHMgKHBnL21MKSAoTFVNSU5FWCBiYXNlZCwgdHdvIGV4cGVyaW1lbnRzIGBNQ1AxYCwgYW5kIGBNQ1AxX3BnX3VnXzIwMTVgKQoKPiBOT1QgQVZBSUxBQkxFIFlFVAotIE1DUC0xIHBsYXNtYSBsZXZlbHMgKHBnL21MKSAoT0xJTksgYmFzZWQpIAoKCmBgYHtyIEJhc2VsaW5lIEFFREI6IGNyZWF0aW9uLCBpbmNsdWRlID0gRkFMU0V9CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCJTRUxFQ1RJT04gVEhFIFNISVpaTEVcbiIpCgojIyMgQXJ0ZXJ5IGxldmVscwojIEFFZGF0YSRBcnRlcnlfc3VtbWFyeTogCiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbAojIE5PVCBVU0UgLSAwIE5vIGFydGVyeSBrbm93biAoeWV0KSwgbm8gc3VyZ2VyeSAocGF0aWVudCBpbGwsIGRpZWQsIGV4aXRlZCBzdHVkeSksIHJlLW51bWJlcmVkIHRvIEFBQQojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIChsZWZ0ICYgcmlnaHQpCiMgVVNFIC0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbC9pbGlhYyAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2Fyb3RpZCBhcnRlcmllcyAoY29tbW9uLCBleHRlcm5hbCkKIyBOT1QgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fyb3RpZCBieXBhc3MgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZXVyeXNtYXRhIChjYXJvdGlkICYgZmVtb3JhbCkKIyBOT1QgVVNFIC0gNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW9ydGEKIyBOT1QgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYXJ0ZXJpZXMgKHJlbmFsLCBwb3BsaXRlYWwsIHZlcnRlYnJhbCkKIyBOT1QgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgIGZlbW9yYWwgYnlwYXNzLCBhbmdpb3NlYWwgYW5kIGluanVyeSAobGVmdCwgcmlnaHQgb3IgYm90aCBzaWRlcykKCiMjIyBBRWRhdGEkaW5mb3JtZWRjb25zZW50CiMgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIC05OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcKIyBOT1QgVVNFIC0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgZGllZAojIFVTRSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgVVNFIC0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIFVTRSAtIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gOSAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDExIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQKIyBOT1QgVVNFIC0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMKIyBOT1QgVVNFIC0gMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUKIyBVU0UgLSAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gY29tbWVyaWNhbCBidXNpbmVzcwojIFVTRSAtIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAyMSAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyMiAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIFVTRSAtIDI2ICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsICBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8KIyBOT1QgVVNFIC0gMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkb2Vzbid0IHdhbnQgdG8KIyBOT1QgVVNFIC0gMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdW5hYmxlIHRvIHNpZ24KIyBOT1QgVVNFIC0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbm8gcmVhY3Rpb24KIyBOT1QgVVNFIC0gMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGxvc3QKIyBOT1QgVVNFIC0gMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIHRvbyBvbGQKIyBOT1QgVVNFIC0gMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBOT1QgVVNFIC0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkKIyBVU0UgLSAzNiAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBlbmRwb2ludAojIFVTRSAtIDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsIG5pZXRzIGludnVsbGVuLCB3ZWwgYWxsZXMgZ2VicnVpa2VuCiMgVVNFIC0gMzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIGluZm9ybWVkIGNvbmNlbnRzOiB5ZXMsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub29pdCBnZWluY2x1ZGVlcmQKCmNhdCgiLSBzYW5pdHkgY2hlY2tpbmcgUFJJT1IgdG8gc2VsZWN0aW9uIikKbGlicmFyeShkYXRhLnRhYmxlKQphZS5nZW5kZXIgPC0gaWZlbHNlKEFFREIkR2VuZGVyID09IDAsICJGZW1hbGUiLCAiTWFsZSIpCmFlLmhvc3BpdGFsIDwtIGlmZWxzZShBRURCJEhvc3BpdGFsID09IDEsICJBbnRvbml1cyIsICJVTUNVIikKdGFibGUoYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgZG5uID0gYygiU2V4IiwgIkhvc3BpdGFsIikpCmFlLmdlbmRlciA8LSBpZmVsc2UoQUVEQiRHZW5kZXIgPT0gMCwgIkZlbWFsZSIsICJNYWxlIikKdGFibGUoYWUuZ2VuZGVyLCBBRURCJEFydGVyeV9zdW1tYXJ5LCBkbm4gPSBjKCJTZXgiLCAiQXJ0ZXJ5IikpCiMgdGFibGUoYWUuZ2VuZGVyLCBBRURCJGluZm9ybWVkY29uc2VudCwgZG5uID0gYygiU2V4IiwgIklDIikpCgpybShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsKQoKIyBJIGNoYW5nZSBudW1lcmljIGFuZCBmYWN0b3JzIG1hbnVhbGx5IGJlY2F1c2UsIHdlbGwsIEkgd291bGRuJ3Qga25vdyBob3cgdG8gZml4IGl0IG90aGVyd2lzZQojIHRvIGhhdmUgdGhpcyAndGliYmxlJyB3b3JrIHdpdGggJ3RhYmxlb25lJy4uLiA6LSkKCkFFREIkQWdlIDwtIGFzLm51bWVyaWMoQUVEQiRBZ2UpCkFFREIkZGlhc3RvbGkgPC0gYXMubnVtZXJpYyhBRURCJGRpYXN0b2xpKQpBRURCJHN5c3RvbGljIDwtIGFzLm51bWVyaWMoQUVEQiRzeXN0b2xpYykKCkFFREIkVENfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWxDVSkKQUVEQiRMRExfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkTERMX2ZpbmFsQ1UpCkFFREIkSERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbENVKQpBRURCJFRHX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsQ1UpCgpBRURCJFRDX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRUQ19maW5hbCkKQUVEQiRMRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbCkKQUVEQiRIRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbCkKQUVEQiRUR19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVEdfZmluYWwpCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJEdGUl9NRFJEIDwtIGFzLm51bWVyaWMoQUVEQiRHRlJfTURSRCkKQUVEQiRCTUkgPC0gYXMubnVtZXJpYyhBRURCJEJNSSkKQUVEQiRlQ2lnYXJldHRlcyA8LSBhcy5udW1lcmljKEFFREIkZUNpZ2FyZXR0ZXMpCkFFREIkZVBhY2tZZWFyc1Ntb2tpbmcgPC0gYXMubnVtZXJpYyhBRURCJGVQYWNrWWVhcnNTbW9raW5nKQpBRURCJEVQX2NvbXBvc2l0ZV90aW1lIDwtIGFzLm51bWVyaWMoQUVEQiRFUF9jb21wb3NpdGVfdGltZSkKCkFFREIkbWFjbWVhbjAgPC0gYXMubnVtZXJpYyhBRURCJG1hY21lYW4wKQpBRURCJHNtY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRzbWNtZWFuMCkKQUVEQiRuZXV0cm9waGlscyA8LSBhcy5udW1lcmljKEFFREIkbmV1dHJvcGhpbHMpCkFFREIkTWFzdF9jZWxsc19wbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCJE1hc3RfY2VsbHNfcGxhcXVlKQpBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkIDwtIGFzLm51bWVyaWMoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCkKCiMgSUw2LCBJTDZSLCBNQ1AxIG1lYXN1cmVtZW50cwpBRURCJElMNiA8LSBhcy5udW1lcmljKEFFREIkSUw2KSAjIEZBQ1MgcGxhcXVlCkFFREIkSUw2X3BnX3VnXzIwMTUgPC0gYXMubnVtZXJpYyhBRURCJElMNl9wZ191Z18yMDE1KSAjIExVTUlORVggcGxhcXVlCkFFREIkSUw2Ul9wZ191Z18yMDE1IDwtIGFzLm51bWVyaWMoQUVEQiRJTDZSX3BnX3VnXzIwMTUpICMgTFVNSU5FWCBwbGFxdWUKQUVEQiRNQ1AxIDwtIGFzLm51bWVyaWMoQUVEQiRNQ1AxKSAjIExVTUlORVggcGxhcXVlCkFFREIkTUNQMV9wZ191Z18yMDE1IDwtIGFzLm51bWVyaWMoQUVEQiRNQ1AxX3BnX3VnXzIwMTUpICMgTFVNSU5FWCBwbGFxdWUKQUVEQiRNQ1AxX3BnX21sXzIwMTUgPC0gYXMubnVtZXJpYyhBRURCJE1DUDFfcGdfbWxfMjAxNSkgIyBMVU1JTkVYIHBsYXF1ZQpBRURCJGhzQ1JQX3BsYXNtYSA8LSBhcy5udW1lcmljKEFFREIkaHNDUlBfcGxhc21hKSAjIExVTUlORVgKCnJlcXVpcmUobGFiZWxsZWQpCkFFREIkT1J5ZWFyIDwtIHRvX2ZhY3RvcihBRURCJE9SeWVhcikKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpBRURCJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQpBRURCJEtET1FJIDwtIHRvX2ZhY3RvcihBRURCJEtET1FJKQpBRURCJEJNSV9XSE8gPC0gdG9fZmFjdG9yKEFFREIkQk1JX1dITykKQUVEQiREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiREaWFiZXRlc1N0YXR1cykKQUVEQiRTbW9rZXJTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyU3RhdHVzKQpBRURCJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIkQWxjb2hvbFVzZSkKCkFFREIkSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMSkKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWcgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMikKQUVEQiRIeXBlcnRlbnNpb24uY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUpCkFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5kcnVncykKCkFFREIkTWVkLmFudGljb2FndWxhbnRzIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbnRpY29hZ3VsYW50cykKQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCkKQUVEQiRNZWQuU3RhdGluLkxMRCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuU3RhdGluLkxMRCkKCkFFREIkU3Ryb2tlX0R4IDwtIHRvX2ZhY3RvcihBRURCJFN0cm9rZV9EeCkKQUVEQiRDQURfaGlzdG9yeSA8LSB0b19mYWN0b3IoQUVEQiRDQURfaGlzdG9yeSkKQUVEQiRQQU9EIDwtIHRvX2ZhY3RvcihBRURCJFBBT0QpCkFFREIkUGVyaXBoZXJhbC5pbnRlcnYgPC0gdG9fZmFjdG9yKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCkFFREIkTWVkSHhfQ1ZEIDwtIHRvX2ZhY3RvcihBRURCJE1lZEh4X0NWRCkKCgpBRURCJHN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJHN5bXB0KQpBRURCJFN5bXB0b21zLjNnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjNnKQpBRURCJFN5bXB0b21zLjRnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjRnKQpBRURCJFN5bXB0b21zLjVHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjVHKQpBRURCJEFzeW1wdFN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJEFzeW1wdFN5bXB0KQpBRURCJEFzeW1wdFN5bXB0MkcgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQyRykKCgpBRURCJHJlc3Rlbm9zIDwtIHRvX2ZhY3RvcihBRURCJHJlc3Rlbm9zKQpBRURCJHN0ZW5vc2UgPC0gdG9fZmFjdG9yKEFFREIkc3Rlbm9zZSkKQUVEQiRFUF9jb21wb3NpdGUgPC0gdG9fZmFjdG9yKEFFREIkRVBfY29tcG9zaXRlKQpBRURCJE1hY3JvcGhhZ2VzLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRNYWNyb3BoYWdlcy5iaW4pCkFFREIkU01DLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRTTUMuYmluKQpBRURCJElQSC5iaW4gPC0gdG9fZmFjdG9yKEFFREIkSVBILmJpbikKQUVEQiRDYWxjLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDYWxjLmJpbikKQUVEQiRDb2xsYWdlbi5iaW4gPC0gdG9fZmFjdG9yKEFFREIkQ29sbGFnZW4uYmluKQpBRURCJEZhdC5iaW5fMTAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl8xMCkKQUVEQiRGYXQuYmluXzQwIDwtIHRvX2ZhY3RvcihBRURCJEZhdC5iaW5fNDApCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSA8LSB0b19mYWN0b3IoQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlKQoKQUVEQiRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQiRBcnRlcnlfc3VtbWFyeSkKCkFFREIkaW5mb3JtZWRjb25zZW50IDwtIHRvX2ZhY3RvcihBRURCJGluZm9ybWVkY29uc2VudCkKCkFFREIuQ0VBIDwtIHN1YnNldChBRURCLAogICAgICAgICAgICAgICAgICAgIChBcnRlcnlfc3VtbWFyeSA9PSAiY2Fyb3RpZCAobGVmdCAmIHJpZ2h0KSIgfCBBcnRlcnlfc3VtbWFyeSA9PSAib3RoZXIgY2Fyb3RpZCBhcnRlcmllcyAoY29tbW9uLCBleHRlcm5hbCkiKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJtaXNzaW5nIiAmICMgd2UgYXJlIHJlYWxseSBzdHJpY3QgaW4gc2VsZWN0aW5nIGJhc2VkIG9uICdpbmZvcm1lZCBjb25zZW50JyEKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkaWVkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBoZWFsdGggdHJlYXRtZW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgZG9lc24ndCB3YW50IHRvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgdW5hYmxlIHRvIHNpZ24iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGxvc3QiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB0b28gb2xkIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubyAobmV2ZXIgYXNrZWQgZm9yIElDIGJlY2F1c2UgdGhlcmUgd2FzIG5vIHRpc3N1ZSkiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBlbmRwb2ludCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm9vaXQgZ2VpbmNsdWRlZXJkIiAmIAogICAgICAgICAgICAgICAgICAgICAhaXMubmEoQXN5bXB0U3ltcHQyRykpCiMgQUVEQi5DRUFbMToxMCwgMToxMF0KZGltKEFFREIuQ0VBKQpgYGAKCmBgYHtyfQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFXG4iKQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbENVIiwgIkxETF9maW5hbENVIiwgIkhETF9maW5hbENVIiwgIlRHX2ZpbmFsQ1UiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwgCiAgICAgICAgICAgICAgICAgICAiaHNDUlBfcGxhc21hIiwKICAgICAgICAgICAgICAgICAgICJzeXN0b2xpYyIsICJkaWFzdG9saSIsICJHRlJfTURSRCIsICJCTUkiLCAKICAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICAiRGlhYmV0ZXNTdGF0dXMiLCAKICAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgICJTdHJva2VfRHgiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiLCAiQXN5bXB0U3ltcHQyRyIsCiAgICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICAiTWVkSHhfQ1ZEIiwgIkNBRF9oaXN0b3J5IiwgIlBBT0QiLCAiUGVyaXBoZXJhbC5pbnRlcnYiLCAKICAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiRVBfY29tcG9zaXRlX3RpbWUiLAogICAgICAgICAgICAgICAgICAgIm1hY21lYW4wIiwgInNtY21lYW4wIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKICAgICAgICAgICAgICAgICAgICJuZXV0cm9waGlscyIsICJNYXN0X2NlbGxzX3BsYXF1ZSIsCiAgICAgICAgICAgICAgICAgICAiSVBILmJpbiIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsCiAgICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICAiRmF0LmJpbl8xMCIsICJGYXQuYmluXzQwIiwgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiLAogICAgICAgICAgICAgICAgICAgIklMNiIsICJJTDZfcGdfdWdfMjAxNSIsICJJTDZSX3BnX3VnXzIwMTUiLAogICAgICAgICAgICAgICAgICAgIk1DUDEiLCAiTUNQMV9wZ191Z18yMDE1IiwgIk1DUDFfcGdfbWxfMjAxNSIpCgpiYXNldGFibGVfYmluID0gYygiR2VuZGVyIiwgCiAgICAgICAgICAgICAgICAgICJLRE9RSSIsICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIyBBbGwgcGF0aWVudHMKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUgb2YgdGhlIHdob2xlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsuCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQn0KIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCkFFREIudGFibGVPbmUgPSBwcmludChDcmVhdGVUYWJsZU9uZSh2YXJzID0gYmFzZXRhYmxlX3ZhcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiU3ltcHRvbXMuNGciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQpgYGAKCiMjIyBDRUEgcGF0aWVudHMKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSBDRUEgcGF0aWVudHMgaW4gdGhlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsuCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgQUVEQiBDRUF9CiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCLkNFQS50YWJsZU9uZSA9IHByaW50KENyZWF0ZVRhYmxlT25lKHZhcnMgPSBiYXNldGFibGVfdmFycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJTeW1wdG9tcy40ZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREIuQ0VBLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQpgYGAKCiMjIyBDRUEgcGF0aWVudHMgd2l0aCBgTUNQMV9wZ191Z18yMDE1YAoKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUgb2YgdGhlIENFQSBwYXRpZW50cyBpbiB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayB3aXRoIGBNQ1AxX3BnX3VnXzIwMTVgLgoKYGBge3IgQmFzZWxpbmUgQUVEQjogVmlzdWFsaXplIHN1YnNldENFQX0KQUVEQi5DRUEuc3Vic2V0IDwtIHN1YnNldChBRURCLkNFQSwgIWlzLm5hKE1DUDFfcGdfdWdfMjAxNSkpCgpBRURCLkNFQS5zdWJzZXQuQXN5bXB0U3ltcHQudGFibGVPbmUgPSBwcmludChDcmVhdGVUYWJsZU9uZSh2YXJzID0gYmFzZXRhYmxlX3ZhcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRhID0gIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLkNFQS5zdWJzZXQsIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjZdCmBgYAoKIyMjIENFQSBwYXRpZW50cyB3aXRoIGBNQ1AxX3BnX3VnXzIwMTVgIGFuZCBgTUNQMWAKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSBDRUEgcGF0aWVudHMgaW4gdGhlIEF0aGVyby1FeHByZXNzIEJpb2Jhbmsgd2l0aCBgTUNQMV9wZ191Z18yMDE1YCBfYW5kXyBgTUNQMWAuCgpgYGB7ciBCYXNlbGluZSBBRURCOiBWaXN1YWxpemUgc3Vic2V0Q0VBIHdpdGggTUNQMX0KCkFFREIuQ0VBLnN1YnNldC5jb21ibyA8LSBzdWJzZXQoQUVEQi5DRUEsICFpcy5uYShNQ1AxX3BnX3VnXzIwMTUpIHwgIWlzLm5hKE1DUDEpKQoKQUVEQi5DRUEuc3Vic2V0LmNvbWJvLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRhID0gIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLkNFQS5zdWJzZXQuY29tYm8sIGluY2x1ZGVOQSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjZdCmBgYAoKIyMjIENFQSBwYXRpZW50cyB3aXRoIHBsYXNtYSBNQ1AxIGxldmVscwoKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUgb2YgdGhlIENFQSBwYXRpZW50cyBpbiB0aGUgQXRoZXJvLUV4cHJlc3MgQmlvYmFuayB3aXRoIHBsYXNtYSBNQ1AxIGxldmVscy4KCj4gTk9UIEFWQUlMQUJMRSBZRVQKCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZSBzdWJzZXRDRUEgd2l0aCBwbGFzbWEgTUNQMX0KQUVEQi5DRUEuc3Vic2V0LnBsYXNtYSA8LSBzdWJzZXQoQUVEQi5DRUEsICFpcy5uYShNQ1AxX3BsYXNtYSkpCgpBRURCLkNFQS5zdWJzZXQucGxhc21hLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YSA9ICJBc3ltcHRTeW1wdDJHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUVEQi5DRUEuc3Vic2V0LnBsYXNtYSwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgbWlzc2luZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgbm9TcGFjZXMgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsIGV4cGxhaW4gPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicGYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Nl0KYGBgCgoKIyMjIENFQSBwYXRpZW50cyB3aXRoIHBsYXNtYSBfYW5kXyBwbGFxdWUgTUNQMSBsZXZlbHMKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSBDRUEgcGF0aWVudHMgaW4gdGhlIEF0aGVyby1FeHByZXNzIEJpb2Jhbmsgd2l0aCBib3RoIHBsYXNtYSBhbmQgcGxhcXVlIE1DUDEgbGV2ZWxzLgoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgQmFzZWxpbmUgQUVEQjogVmlzdWFsaXplIHN1YnNldENFQSB3aXRoIHBsYXNtYSBNQ1AxIGFuZCBwbGFxdWUgTUNQMX0KQUVEQi5DRUEuc3Vic2V0LmJvdGggPC0gc3Vic2V0KEFFREIuQ0VBLCAhaXMubmEoTUNQMV9wZ191Z18yMDE1KSAmICFpcy5uYShNQ1AxKSkKCkFFREIuQ0VBLnN1YnNldC5ib3RoLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRhID0gIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBRURCLkNFQS5zdWJzZXQuYm90aCwgaW5jbHVkZU5BID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Nl0KYGBgCgpXcml0aW5nIHRoZSBiYXNlbGluZSB0YWJsZSB0byBFeGNlbCBmb3JtYXQuIApgYGB7ciBCYXNlbGluZSBBRURCOiB3cml0ZX0KIyBXcml0ZSBiYXNldGFibGUKcmVxdWlyZShvcGVueGxzeCkKCndyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5CYXNlbGluZVRhYmxlLndob2xlQ0VBLnhsc3giKSwKICAgICAgICAgICBBRURCLkNFQS50YWJsZU9uZSwgCiAgICAgICAgICAgcm93Lm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgCiAgICAgICAgICAgc2hlZXROYW1lID0gIndob2xlQUVEQl9CYXNlbGluZSIpCgp3cml0ZS54bHN4KGZpbGUgPSBwYXN0ZTAoQkFTRUxJTkVfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuQmFzZWxpbmVUYWJsZS53aG9sZUNFQS5Bc3ltcHRTeW1wdC54bHN4IiksCiAgICAgICAgICAgQUVEQi5DRUEuc3Vic2V0LkFzeW1wdFN5bXB0LnRhYmxlT25lLCAKICAgICAgICAgICByb3cubmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBjb2wubmFtZXMgPSBUUlVFLCAKICAgICAgICAgICBzaGVldE5hbWUgPSAid2hvbGVBRURCX0Jhc2VsaW5lX1N5bXB0IikKCndyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5CYXNlbGluZVRhYmxlLnN1YnNldENFQS54bHN4IiksCiAgICAgICAgICAgQUVEQi5DRUEuc3Vic2V0LmNvbWJvLnRhYmxlT25lLAogICAgICAgICAgIHJvdy5uYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwKICAgICAgICAgICBzaGVldE5hbWUgPSAic3Vic2V0QUVEQl9CYXNlbGluZSIpCgojIHdyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChCQVNFTElORV9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5BRS5CYXNlbGluZVRhYmxlLnN1YnNldENFQXBsYXNtYS5Bc3ltcHRTeW1wdC54bHN4IiksCiMgICAgICAgICAgICBBRURCLkNFQS5zdWJzZXQucGxhc21hLnRhYmxlT25lLCAKIyAgICAgICAgICAgIHJvdy5uYW1lcyA9IFRSVUUsIAojICAgICAgICAgICAgY29sLm5hbWVzID0gVFJVRSwgCiMgICAgICAgICAgICBzaGVldE5hbWUgPSAic3Vic2V0QUVEQl9CYXNlbGluZV9wbGFzbWFfU3ltcHQiKQoKYGBgCgoKIyMgRGF0YSBleHBsb3JhdGlvbgoKSGVyZSB3ZSBpbnNwZWN0IHRoZSBkYXRhIGFuZCB3aGVuIG5lY2Vzc2FyeSB0cmFuc2Zvcm0gcXVhbnRpdGF0aXZlIG1lYXN1cmVzLiBXZSB3aWxsIGluc3BlY3QgdGhlIHJhdywgbmF0dXJhbCBsb2cgdHJhbnNmb3JtZWQgKyB0aGUgc21hbGxlc3QgbWVhc3VyZW1lbnQsIGFuZCBpbnZlcnNlLW5vcm1hbCB0cmFuc2Zvcm1hdGlvbi4gCgojIyMgTUNQMSBwbGFxdWUgbGV2ZWxzOiBleHBlcmltZW50IDIKCldlIHdpbGwgZXhwbG9yZSB0aGUgcGxhcXVlIGxldmVscy4gQXMgbm90ZWQgYWJvdmUsIHdlIHdpbGwgdXNlIGBNQ1AxX3BnX3VnXzIwMTVgLCB0aGlzIHdhcyBleHBlcmltZW50IDIgaW4gMjAxNSBvbiB0aGUgTFVNSU5FWC1wbGF0Zm9ybSBhbmQgbWVhc3VyZW1lbnRzIHdlcmUgY29ycmVjdGVkIGZvciB0b3RhbCBwbGFxdWUgcHJvdGVpbiBjb250ZW50LgoKYGBge3IgRGF0YUV4cGxvcmF0aW9uOiBNQ1AxIHBsYXF1ZSBFeHAyfQoKc3VtbWFyeShBRURCLkNFQSRNQ1AxX3BnX3VnXzIwMTUpCgpkby5jYWxsKHJiaW5kICwgYnkoQUVEQi5DRUEkTUNQMV9wZ191Z18yMDE1LCBBRURCLkNFQSRBc3ltcHRTeW1wdDJHLCBzdW1tYXJ5KSkKCgpzdW1tYXJ5KEFFREIuQ0VBJE1DUDFfcGdfbWxfMjAxNSkKCmRvLmNhbGwocmJpbmQgLCBieShBRURCLkNFQSRNQ1AxX3BnX21sXzIwMTUsIEFFREIuQ0VBJEFzeW1wdFN5bXB0MkcsIHN1bW1hcnkpKQpgYGAKCmBgYHtyIERhdGFFeHBsb3JhdGlvbjogTUNQMSBwbGFxdWUgRXhwMiB2aXN1YWx9CmxpYnJhcnkocGF0Y2h3b3JrKQpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWFuIiwgCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInBnL3VnIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCm1pbl9NQ1AxX3BnX3VnXzIwMTUgPC0gbWluKEFFREIuQ0VBJE1DUDFfcGdfdWdfMjAxNSwgbmEucm0gPSBUUlVFKQptaW5fTUNQMV9wZ191Z18yMDE1CgpBRURCLkNFQSRNQ1AxX3BnX3VnXzIwMTVfTE4gPC0gbG9nKEFFREIuQ0VBJE1DUDFfcGdfdWdfMjAxNSArIG1pbl9NQ1AxX3BnX3VnXzIwMTUpCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxX3BnX3VnXzIwMTVfTE4iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lYW4iLCAKICAgICAgICAgICAgICAgICAgICAjIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIyBhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICAjIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJuYXR1cmFsIGxvZy10cmFuc2Zvcm1lZCBwZy91ZyIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpBRURCLkNFQSRNQ1AxX3BnX3VnXzIwMTVfcmFuayA8LSBxbm9ybSgocmFuayhBRURCLkNFQSRNQ1AxX3BnX3VnXzIwMTUsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQi5DRUEkTUNQMV9wZ191Z18yMDE1KSkpCnAzIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLAogICAgICAgICAgICAgICAgICAgICMgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImludmVyc2Utbm9ybWFsIHRyYW5zZm9ybWF0aW9uIHBnL3VnIiwKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDEgCnAyIApwMwojIGdncGFyKHAxLCBsZWdlbmQgPSAiIikgLyBnZ3BhcihwMiwgbGVnZW5kID0gIiIpICB8IGdncGFyKHAzLCBsZWdlbmQgPSAicmlnaHQiKQoKcm0ocDEsIHAyLCBwMykKYGBgCgpXZSB3aWxsIGV4cGxvcmUgdGhlIGBNQ1AxX3BnX21sXzIwMTVgIGxldmVscyBhbmQgY29tcGFyZSB0byB0aGUgcHJvdGVpbiBjb250ZW50IGNvcnJlY3RlZCBvbmVzLiAKCmBgYHtyIERhdGFFeHBsb3JhdGlvbjogTUNQMSBwbGFxdWUgcGctbWwgRXhwMiB2aXN1YWx9CmxpYnJhcnkocGF0Y2h3b3JrKQpwMSA8LSBnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiTUNQMV9wZ19tbF8yMDE1IiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWFuIiwgCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInBnL21MIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCm1pbl9NQ1AxX3BnX21sXzIwMTUgPC0gbWluKEFFREIuQ0VBJE1DUDFfcGdfbWxfMjAxNSwgbmEucm0gPSBUUlVFKQptaW5fTUNQMV9wZ19tbF8yMDE1CgpBRURCLkNFQSRNQ1AxX3BnX21sXzIwMTVfTE4gPC0gbG9nKEFFREIuQ0VBJE1DUDFfcGdfbWxfMjAxNSArIG1pbl9NQ1AxX3BnX21sXzIwMTUpCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxX3BnX21sXzIwMTVfTE4iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lYW4iLCAKICAgICAgICAgICAgICAgICAgICAjIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIyBhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICAjIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJuYXR1cmFsIGxvZy10cmFuc2Zvcm1lZCBwZy9tTCIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpBRURCLkNFQSRNQ1AxX3BnX21sXzIwMTVfcmFuayA8LSBxbm9ybSgocmFuayhBRURCLkNFQSRNQ1AxX3BnX21sXzIwMTUsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQi5DRUEkTUNQMV9wZ19tbF8yMDE1KSkpCnAzIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxX3BnX21sXzIwMTVfcmFuayIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLAogICAgICAgICAgICAgICAgICAgICMgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImludmVyc2Utbm9ybWFsIHRyYW5zZm9ybWF0aW9uIHBnL21MIiwKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDEgCnAyIApwMwojIGdncGFyKHAxLCBsZWdlbmQgPSAiIikgLyBnZ3BhcihwMiwgbGVnZW5kID0gIiIpICB8IGdncGFyKHAzLCBsZWdlbmQgPSAicmlnaHQiKQoKcm0ocDEsIHAyLCBwMykKYGBgCgojIyMgTUNQMSBwbGFxdWUgbGV2ZWxzOiBleHBlcmltZW50IDEKCldlIHdpbGwgZXhwbG9yZSB0aGUgcGxhcXVlIGxldmVscy4gQXMgbm90ZWQgYWJvdmUsIHdlIHdpbGwgdXNlIGBNQ1AxYCwgdGhpcyB3YXMgZXhwZXJpbWVudCAxIG9uIHRoZSBMVU1JTkVYLXBsYXRmb3JtIGFuZCBtZWFzdXJlbWVudHMgd2VyZSBjb3JyZWN0ZWQgZm9yIHRvdGFsIHBsYXF1ZSBwcm90ZWluIGNvbnRlbnQuCgpgYGB7ciBEYXRhRXhwbG9yYXRpb246IE1DUDEgcGxhcXVlIEV4cDF9CgojIHN1bW1hcnkoQUVEQi5DRUEkTUNQMSkKIyAKIyBkby5jYWxsKHJiaW5kICwgYnkoQUVEQi5DRUEkTUNQMSwgQUVEQi5DRUEkQXN5bXB0U3ltcHQyRywgc3VtbWFyeSkpCiMgCiMgYXR0YWNoKEFFREIuQ0VBKQpBRURCLkNFQSRNQ1AxW01DUDEgPT0gMF0gPC0gTkEKIyBkZXRhY2goQUVEQi5DRUEpCgpzdW1tYXJ5KEFFREIuQ0VBJE1DUDEpCgpkby5jYWxsKHJiaW5kICwgYnkoQUVEQi5DRUEkTUNQMSwgQUVEQi5DRUEkQXN5bXB0U3ltcHQyRywgc3VtbWFyeSkpCgpgYGAKCmBgYHtyIERhdGFFeHBsb3JhdGlvbjogTUNQMSBwbGFxdWUgRXhwMSB2aXN1YWx9CnAxIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWFuIiwgCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInBnL21MIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCm1pbl9NQ1AxIDwtIG1pbihBRURCLkNFQSRNQ1AxLCBuYS5ybSA9IFRSVUUpCm1pbl9NQ1AxCgpBRURCLkNFQSRNQ1AxX0xOIDwtIGxvZyhBRURCLkNFQSRNQ1AxICsgbWluX01DUDEpCnAyIDwtIGdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJNQ1AxX0xOIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWFuIiwgCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIm5hdHVyYWwgbG9nLXRyYW5zZm9ybWVkIHBnL3VnIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCkFFREIuQ0VBJE1DUDFfcmFuayA8LSBxbm9ybSgocmFuayhBRURCLkNFQSRNQ1AxLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIuQ0VBJE1DUDEpKSkKcDMgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLkNFQSwgIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLAogICAgICAgICAgICAgICAgICAgICMgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImludmVyc2Utbm9ybWFsIHRyYW5zZm9ybWF0aW9uIHBnL3VnIiwKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDEgCnAyIApwMwojIGdncGFyKHAxLCBsZWdlbmQgPSAiIikgLyBnZ3BhcihwMiwgbGVnZW5kID0gIiIpICB8IGdncGFyKHAzLCBsZWdlbmQgPSAicmlnaHQiKQoKcm0ocDEsIHAyLCBwMykKCmBgYAoKIyMjIyBDb3JyZWxhdGlvbnMgYmV0d2VlbiBNQ1AxIHBsYXF1ZSBsZXZlbHMgYW5kIHRyYW5zZm9ybWF0aW9ucwoKSGVyZSB3ZSBjb21wYXJlIHRoZSBNQ1AxIHBsYXF1ZSBsZXZlbHMgZnJvbSBleHBlcmltZW50IDEgd2l0aCB0aG9zZSBleHBlcmltZW50IDIuIFRoZSBsYXR0ZXIgd2UgbWVhc3VyZWQgaW4gcGcvbUwgYW5kIGFsc28gY29ycmVjdGVkIGZvciB0aGUgdG90YWwgcHJvdGVpbiBjb250ZW50IChwZy91ZykuCmBgYHtyIE1DUDEgc2NhdHRlcnM6IHRyYW5zZm9ybWF0aW9uc30KcDEgPC0gZ2dwdWJyOjpnZ3NjYXR0ZXIoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICB4ID0gIk1DUDFfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfbWxfMjAxNV9yYW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJleHBlcmltZW50IDEiLAogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gImV4cGVyaW1lbnQgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscywgSU5ULCBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIAoKcDIgPC0gZ2dwdWJyOjpnZ3NjYXR0ZXIoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICB4ID0gIk1DUDFfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJleHBlcmltZW50IDEiLAogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gImV4cGVyaW1lbnQgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscywgSU5ULCBbcGcvbUxdL1twZy91Z10iLAogICAgICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgCgpwMyA8LSBnZ3B1YnI6Omdnc2NhdHRlcihBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiTUNQMV9wZ19tbF8yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiMxMjkwRDkiLAogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgIyBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJzcGVhcm1hbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZXhwZXJpbWVudCAyLCBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJleHBlcmltZW50IDIsIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJNQ1AxIHBsYXF1ZSBsZXZlbHMsIElOVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpwMwoKYGBgCgoKCiMjIyBNQ1AxIHBsYXNtYSBsZXZlbHMgCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgoKIyMgUHJlbGltaW5hcnkgY29uY2x1c2lvbiBkYXRhIGV4cGxvcmF0aW9uCgpJbiBsaW5lIHdpdGggdGhlIHByZXZpb3VzIHdvcmsgYnkgW01hcmlvcyBHZW9yZ2FraXNdKGh0dHBzOi8vd3d3LmFoYWpvdXJuYWxzLm9yZy9kb2kvZnVsbC8xMC4xMTYxL0NJUkNSRVNBSEEuMTE5LjMxNTM4MCl7dGFyZ2V0PSJfYmxhbmsifSB3ZSB3aWxsIGFwcGx5IF9uYXR1cmFsIGxvZyB0cmFuc2Zvcm1hdGlvbl8gb24gYWxsIHByb3RlaW5zIGFuZCBmb2N1cyB0aGUgYW5hbHlzaXMgb24gTUNQMSBpbiBwbGFzbWEgYW5kIHBsYXF1ZS4KCiMgQW5hbHlzZXMKClRoZSBhbmFseXNlcyBhcmUgZm9jdXNlZCBvbiB0aHJlZSBlbGVtZW50czogCgoxKSBwbGFxdWUgdnVsbmVyYWJpbGl0eSBwaGVub3R5cGVzCjIpIGNsaW5pY2FsIHN0YXR1cyBhdCBpbmNsdXNpb24gKHN5bXB0b21zKQozKSBzZWNvbmRhcnkgY2xpbmljYWwgb3V0Y29tZSBkdXJpbmcgdGhyZWUgKDMpIHllYXJzIG9mIGZvbGxvdy11cAoKIyMgQ292YXJpYXRlcyAmIG90aGVyIHZhcmlhYmxlcwoKMS4gIEFnZSAoY29udGludW91cyBpbiAxLXllYXIgaW5jcmVtZW50KS4gW2BBZ2VgXQoyLiAgU2V4IChtYWxlIHZzLiBmZW1hbGUpLiBbYEdlbmRlcmBdCjMuICBQcmVzZW5jZSBvZiBoeXBlcnRlbnNpb24gYXQgYmFzZWxpbmUgKGRlZmluZWQgZWl0aGVyIGFzIGhpc3Rvcnkgb2YgaHlwZXJ0ZW5zaW9uLCBTQlAg4omlMTQwIG1tIEhnLCBEQlAg4omlOTAgbW0gSGcsIG9yIHByZXNjcmlwdGlvbiBvZiBhbnRpaHlwZXJ0ZW5zaXZlIG1lZGljYXRpb25zKS4gW2BIeXBlcnRlbnNpb24uY29tcG9zaXRlYF0KNC4gIFByZXNlbmNlIG9mIGRpYWJldGVzIG1lbGxpdHVzIGF0IGJhc2VsaW5lIChkZWZpbmVkIGVpdGhlciBhcyBhIGhpc3Rvcnkgb2YgZGlhYmV0ZXMgYW5kL29yIGFkbWluaXN0cmF0aW9uIG9mIGdsdWNvc2UgbG93ZXJpbmcgbWVkaWNhdGlvbikuIFtgRGlhYmV0ZXNTdGF0dXNgXQo1LiAgU21va2luZyAoY3VycmVudCwgZXgtLCBuZXZlcikuIFtgU21va2VyU3RhdHVzYF0KNi4gIExETC1DIGxldmVscyAoY29udGludW91cykuIFtgTERMX2ZpbmFsYF0KNy4gIFVzZSBvZiBsaXBpZC1sb3dlcmluZyBkcnVncy4gW2BNZWQuU3RhdGluLkxMRGBdCjguICBVc2Ugb2YgYW50aXBsYXRlbGV0IGRydWdzLiBbYE1lZC5hbGwuYW50aXBsYXRlbGV0YF0KOS4gIGVHRlIgKGNvbnRpbnVvdXMpLiBbYEdGUl9NRFJEYF0KMTAuCUJNSSAoY29udGludW91cykuIFtgQk1JYF0KMTEuCUhpc3Rvcnkgb2YgY2FyZGlvdmFzY3VsYXIgZGlzZWFzZSAoc3Ryb2tlLCBjb3JvbmFyeSBhcnRlcnkgZGlzZWFzZSwgcGVyaXBoZXJhbCBhcnRlcnkgZGlzZWFzZSkuIFtgTWVkSHhfQ1ZEYF0gY29tYmluYXRpb24gb2YgW2BDQURfaGlzdG9yeWAsIGBTdHJva2VfaGlzdG9yeWAsIGBQZXJpcGhlcmFsLmludGVydmBdCjEyLglMZXZlbCBvZiBzdGVub3NpcyAoNTAtNzAlIHZzLiA3MC05OSUpLiBbYHN0ZW5vc2VgXQoxMy4gWWVhciBvZiBzdXJnZXJ5IFtgT1JkYXRlX3llYXJgXSBhcyB3ZSBkaXNjb3ZlcmVkIGluIFZhbiBMYW1tZXJlbiBfZXQgYWwuXyB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHBsYXF1ZSBhbmQgdGhlcmVmb3JlIHRoZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5IGhhcyBjaGFuZ2VkIG92ZXIgdGhlIHllYXJzLiBMaWtlbHkgdGhyb3VnaCBjaGFuZ2VzIGluIGxpZmVzdHlsZSBhbmQgcHJpbWFyeSBwcmV2ZW50aW9uIHJlZ2ltZXMuCgojIyBNb2RlbHMKCldlIHdpbGwgYW5hbHl6ZSB0aGUgZGF0YSB0aHJvdWdoIGZvdXIgZGlmZmVyZW50IG1vZGVscwoKLSBNb2RlbCAxOiBhZGp1c3RlZCBmb3IgYWdlLCBzZXgsIGFuZCB5ZWFyIG9mIHN1cmdlcnkKLSBNb2RlbCAyOiBhZGp1c3RlZCBmb3IgYWdlLCBzZXgsIHllYXIgb2Ygc3VyZ2VyeSwgYW5kIGFkZGl0aW9uYWxseSBhZGp1c3RlZCBmb3IgaGlzdG9yeSBoeXBlcnRlbnNpb24gKGRlZmluZWQgZnJvbSBtZWRpY2FsIGhpc3RvcnkgYW5kL29yIHVzZSBvZiBhbnRpaHlwZXJ0ZW5zaXZlIG1lZGljYXRpb25zKSwgZGlhYmV0ZXMgKGRlZmluZWQgYXMgaGlzdG9yeSBvZiBhIGRpYWdub3NpcyBhbmQvb3IgdXNlIG9mIGdsdWNvc2UtbG93ZXJpbmcgbWVkaWNhdGlvbnMpLCBjdXJyZW50IHNtb2tpbmcsIExETC1DIGxldmVscyBhdCB0aW1lIG9mIG9wZXJhdGlvbiwgdXNlIG9mIHN0YXRpbnMsIHVzZSBvZiBhbnRpcGxhdGVsZXQgYWdlbnRzLCBlR0ZSLCBCTUksIGhpc3Rvcnkgb2YgY2FyZGlvdmFzY3VsYXIgZGlzZWFzZSAoY29yb25hcnkgYXJ0ZXJ5IGRpc2Vhc2UsIHN0cm9rZSwgcGVyaXBoZXJhbCBhcnRlcnkgZGlzZWFzZSksIGFuZCBsZXZlbCBvZiBzdGVub3NpcyAoNTAtNzAlLCA3MC05MCUsIDkwLTk5JSkKCiMjIEEuIENyb3NzLXNlY3Rpb25hbCBhbmFseXNpcyBwbGFxdWUgcGhlbm90eXBlcwoKSW4gdGhlIGNyb3NzLXNlY3Rpb25hbCBhbmFseXNpcyBvZiBwbGFxdWUgYW5kIHBsYXNtYSBNQ1AxLCBJTDYsIGFuZCBJTDZSIGxldmVscyB3ZSB3aWxsIGZvY3VzIG9uIHRoZSBmb2xsb3dpbmcgcGxhcXVlIHZ1bG5lcmFiaWxpdHkgcGhlbm90eXBlczoKCi0gUGVyY2VudGFnZSBvZiBtYWNyb3BoYWdlcyAoY29udGludW91cyB0cmFpdCkKLSBQZXJjZW50YWdlIG9mIFNNQ3MgKGNvbnRpbnVvdXMgdHJhaXQpCi0gTnVtYmVyIG9mIGludHJhcGxhcXVlIG1pY3JvdmVzc2VscyBwZXIgMy00IGhvdHNwb3RzIChjb250aW51b3VzIHRyYWl0KQotIFByZXNlbmNlIG9mIG1vZGVyYXRlL2hlYXZ5IGNhbGNpZmljYXRpb25zIChiaW5hcnkgdHJhaXQpCi0gUHJlc2VuY2Ugb2YgbW9kZXJhdGUvaGVhdnkgY29sbGFnZW4gY29udGVudCAoYmluYXJ5IHRyYWl0KQotIFByZXNlbmNlIG9mIGxpcGlkIGNvcmUgbm8vPDEwJSB2cy4gPjEwJSAoYmluYXJ5IHRyYWl0KQotIFByZXNlbmNlIG9mIGludHJhcGxhcXVlIGhlbW9ycmhhZ2UgKGJpbmFyeSB0cmFpdCkKCipDb250aW5vdXMgdHJhaXRzKgpgYGB7ciBDcm9zc1NlYzogcGxhcXVlcyAtIHRyYW5zZm9ybWF0aW9ucyBhbmQgdmlzdWFsaXNhdGlvbnMgY29udGludW91c30KCiMgbWFjcm9waGFnZXMKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpzdW1tYXJ5KEFFREIuQ0VBJG1hY21lYW4wKQoKbWluX21hY21lYW4gPC0gbWluKEFFREIuQ0VBJG1hY21lYW4wLCBuYS5ybSA9IFRSVUUpCmNhdChwYXN0ZTAoIlxuTWluaW11bSB2YWx1ZSAlIG1hY3JvcGhhZ2VzOiAiLG1pbl9tYWNtZWFuLCIuXG4iKSkKCkFFREIuQ0VBJE1hY3JvcGhhZ2VzX0xOIDwtIGxvZyhBRURCLkNFQSRtYWNtZWFuMCArIG1pbl9tYWNtZWFuKQoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLkNFQSwgIk1hY3JvcGhhZ2VzX0xOIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlIG1hY3JvcGhhZ2VzIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIm5hdHVyYWwgbG9nLXRyYW5zZm9ybWVkICUiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKQUVEQi5DRUEkTWFjcm9waGFnZXNfcmFuayA8LSBxbm9ybSgocmFuayhBRURCLkNFQSRtYWNtZWFuMCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCLkNFQSRtYWNtZWFuMCkpKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiTWFjcm9waGFnZXNfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBtYWNyb3BoYWdlcyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCAlIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCiMgc21vb3RoIG11c2NsZSBjZWxscwpjYXQoIlN1bW1hcnkgb2YgZGF0YS5cbiIpCnN1bW1hcnkoQUVEQi5DRUEkbWFjbWVhbjApCgptaW5fc21jbWVhbiA8LSBtaW4oQUVEQi5DRUEkc21jbWVhbjAsIG5hLnJtID0gVFJVRSkKY2F0KHBhc3RlMCgiXG5NaW5pbXVtIHZhbHVlICUgc21vb3RoIG11c2NsZSBjZWxsczogIixtaW5fc21jbWVhbiwiLlxuIikpCgpBRURCLkNFQSRTTUNfTE4gPC0gbG9nKEFFREIuQ0VBJHNtY21lYW4wICsgbWluX3NtY21lYW4pCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiU01DX0xOIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlIHNtb290aCBtdXNjbGUgY2VsbHMiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAibmF0dXJhbCBsb2ctdHJhbnNmb3JtZWQgJSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpBRURCLkNFQSRTTUNfcmFuayA8LSBxbm9ybSgocmFuayhBRURCLkNFQSRzbWNtZWFuMCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCLkNFQSRzbWNtZWFuMCkpKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiU01DX3JhbmsiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgc21vb3RoIG11c2NsZSBjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCAlIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCiMgdmVzc2VsIGRlbnNpdHkKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpzdW1tYXJ5KEFFREIuQ0VBJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkKQoKbWluX3Zlc3NlbGRlbnNpdHkgPC0gbWluKEFFREIuQ0VBJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkLCBuYS5ybSA9IFRSVUUpCm1pbl92ZXNzZWxkZW5zaXR5CmNhdChwYXN0ZTAoIlxuTWluaW11bSB2YWx1ZSBudW1iZXIgb2YgaW50cmFwbGFxdWUgbmVvdmVzc2VscyBwZXIgMy00IGhvdHNwb3RzOiAiLG1pbl92ZXNzZWxkZW5zaXR5LCIuXG4iKSkKCkFFREIuQ0VBJFZlc3NlbERlbnNpdHlfTE4gPC0gbG9nKEFFREIuQ0VBJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkICsgbWluX3Zlc3NlbGRlbnNpdHkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIuQ0VBLCAiVmVzc2VsRGVuc2l0eV9MTiIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMgcGVyIDMtNCBob3RzcG90cyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJuYXR1cmFsIGxvZy10cmFuc2Zvcm1lZCBudW1iZXIiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKQUVEQi5DRUEkVmVzc2VsRGVuc2l0eV9yYW5rIDwtIHFub3JtKChyYW5rKEFFREIuQ0VBJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIuQ0VBJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkKSkpCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQi5DRUEsICJWZXNzZWxEZW5zaXR5X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBpbnRyYXBsYXF1ZSBuZW92ZXNzZWxzIHBlciAzLTQgaG90c3BvdHMiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBudW1iZXIiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQpgYGAKCipCaW5hcnkgdHJhaXRzKgpgYGB7ciBDcm9zc1NlYzogcGxhcXVlcyAtIHRyYW5zZm9ybWF0aW9ucyBhbmQgdmlzdWFsaXNhdGlvbnMgYmluYXJ5fQoKIyBjYWxjaWZpY2F0aW9uCmNhdCgiU3VtbWFyeSBvZiBkYXRhLlxuIikKc3VtbWFyeShBRURCLkNFQSRDYWxjLmJpbikKY29udHJhc3RzKEFFREIuQ0VBJENhbGMuYmluKQoKQUVEQi5DRUEkQ2FsY2lmaWNhdGlvblBsYXF1ZSA8LSBhcy5mYWN0b3IoQUVEQi5DRUEkQ2FsYy5iaW4pCgpkZiA8LSBBRURCLkNFQSAlPiUKICBmaWx0ZXIoIWlzLm5hKENhbGNpZmljYXRpb25QbGFxdWUpKSAlPiUKICBncm91cF9ieShHZW5kZXIsIENhbGNpZmljYXRpb25QbGFxdWUpICU+JQpzdW1tYXJpc2UoY291bnRzID0gbigpKSAKCmdncHVicjo6Z2diYXJwbG90KGRmLCB4ID0gIkNhbGNpZmljYXRpb25QbGFxdWUiLCB5ID0gImNvdW50cyIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCBsYWIudmp1c3QgPSAyLCBsYWIuY29sID0gIiNGRkZGRkYiLAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkNhbGNpZmljYXRpb24iLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY2FsY2lmaWNhdGlvbiIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCnJtKGRmKQoKIyBjb2xsYWdlbgpjYXQoIlN1bW1hcnkgb2YgZGF0YS5cbiIpCnN1bW1hcnkoQUVEQi5DRUEkQ29sbGFnZW4uYmluKQpjb250cmFzdHMoQUVEQi5DRUEkQ29sbGFnZW4uYmluKQoKQUVEQi5DRUEkQ29sbGFnZW5QbGFxdWUgPC0gYXMuZmFjdG9yKEFFREIuQ0VBJENvbGxhZ2VuLmJpbikKCmRmIDwtIEFFREIuQ0VBICU+JQogIGZpbHRlcighaXMubmEoQ29sbGFnZW5QbGFxdWUpKSAlPiUKICBncm91cF9ieShHZW5kZXIsIENvbGxhZ2VuUGxhcXVlKSAlPiUKc3VtbWFyaXNlKGNvdW50cyA9IG4oKSkgCgpnZ3B1YnI6OmdnYmFycGxvdChkZiwgeCA9ICJDb2xsYWdlblBsYXF1ZSIsIHkgPSAiY291bnRzIiwKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIGxhYi52anVzdCA9IDIsIGxhYi5jb2wgPSAiI0ZGRkZGRiIsCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiQ29sbGFnZW4iLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY29sbGFnZW4iLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQpybShkZikKCiMgZmF0IDEwJQpjYXQoIlN1bW1hcnkgb2YgZGF0YS5cbiIpCnN1bW1hcnkoQUVEQi5DRUEkRmF0LmJpbl8xMCkKY29udHJhc3RzKEFFREIuQ0VBJEZhdC5iaW5fMTApCgpBRURCLkNFQSRGYXQxMFBlcmMgPC0gYXMuZmFjdG9yKEFFREIuQ0VBJEZhdC5iaW5fMTApCgpkZiA8LSBBRURCLkNFQSAlPiUKICBmaWx0ZXIoIWlzLm5hKEZhdDEwUGVyYykpICU+JQogIGdyb3VwX2J5KEdlbmRlciwgRmF0MTBQZXJjKSAlPiUKc3VtbWFyaXNlKGNvdW50cyA9IG4oKSkgCgpnZ3B1YnI6OmdnYmFycGxvdChkZiwgeCA9ICJGYXQxMFBlcmMiLCB5ID0gImNvdW50cyIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCBsYWIudmp1c3QgPSAyLCBsYWIuY29sID0gIiNGRkZGRkYiLAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkludHJhcGxhcXVlIGZhdCIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJpbnRyYXBsYXF1ZSBmYXQiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQpybShkZikKCiMgbWFjcm9waGFnZXMgYmlubmVkCmNhdCgiU3VtbWFyeSBvZiBkYXRhLlxuIikKc3VtbWFyeShBRURCLkNFQSRNYWNyb3BoYWdlcy5iaW4pCmNvbnRyYXN0cyhBRURCLkNFQSRNYWNyb3BoYWdlcy5iaW4pCgpBRURCLkNFQSRNQUNfYmlubmVkIDwtIGFzLmZhY3RvcihBRURCLkNFQSRNYWNyb3BoYWdlcy5iaW4pCgpkZiA8LSBBRURCLkNFQSAlPiUKICBmaWx0ZXIoIWlzLm5hKE1BQ19iaW5uZWQpKSAlPiUKICBncm91cF9ieShHZW5kZXIsIE1BQ19iaW5uZWQpICU+JQpzdW1tYXJpc2UoY291bnRzID0gbigpKSAKCmdncHVicjo6Z2diYXJwbG90KGRmLCB4ID0gIk1BQ19iaW5uZWQiLCB5ID0gImNvdW50cyIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCBsYWIudmp1c3QgPSAyLCBsYWIuY29sID0gIiNGRkZGRkYiLAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1hY3JvcGhhZ2VzIChiaW5uZWQpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIk1hY3JvcGhhZ2VzIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKcm0oZGYpCgojIG1hY3JvcGhhZ2VzIGdyb3VwZWQKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpBRURCLkNFQSRtYWNyb3BoYWdlcyA8LSBhcy5mYWN0b3IoQUVEQi5DRUEkbWFjcm9waGFnZXMpCnN1bW1hcnkoQUVEQi5DRUEkbWFjcm9waGFnZXMpCmNvbnRyYXN0cyhBRURCLkNFQSRtYWNyb3BoYWdlcykKCkFFREIuQ0VBJE1BQ19ncm91cGVkIDwtIGFzLmZhY3RvcihBRURCLkNFQSRtYWNyb3BoYWdlcykKCmRmIDwtIEFFREIuQ0VBICU+JQogIGZpbHRlcighaXMubmEoTUFDX2dyb3VwZWQpKSAlPiUKICBncm91cF9ieShHZW5kZXIsIE1BQ19ncm91cGVkKSAlPiUKc3VtbWFyaXNlKGNvdW50cyA9IG4oKSkgCgpnZ3B1YnI6OmdnYmFycGxvdChkZiwgeCA9ICJNQUNfZ3JvdXBlZCIsIHkgPSAiY291bnRzIiwKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIGxhYi52anVzdCA9IDIsIGxhYi5jb2wgPSAiI0ZGRkZGRiIsCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTWFjcm9waGFnZXMgKGdyb3VwZWQpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIk1hY3JvcGhhZ2VzIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKcm0oZGYpCgojIFNNQyBiaW5uZWQKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpzdW1tYXJ5KEFFREIuQ0VBJFNNQy5iaW4pCmNvbnRyYXN0cyhBRURCLkNFQSRTTUMuYmluKQoKQUVEQi5DRUEkU01DX2Jpbm5lZCA8LSBhcy5mYWN0b3IoQUVEQi5DRUEkU01DLmJpbikKCmRmIDwtIEFFREIuQ0VBICU+JQogIGZpbHRlcighaXMubmEoU01DX2Jpbm5lZCkpICU+JQogIGdyb3VwX2J5KEdlbmRlciwgU01DX2Jpbm5lZCkgJT4lCnN1bW1hcmlzZShjb3VudHMgPSBuKCkpIAoKZ2dwdWJyOjpnZ2JhcnBsb3QoZGYsIHggPSAiU01DX2Jpbm5lZCIsIHkgPSAiY291bnRzIiwKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIGxhYi52anVzdCA9IDIsIGxhYi5jb2wgPSAiI0ZGRkZGRiIsCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiU01DIChiaW5uZWQpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIlNNQyIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCnJtKGRmKQoKIyBTTUMgZ3JvdXBlZApjYXQoIlN1bW1hcnkgb2YgZGF0YS5cbiIpCkFFREIuQ0VBJHNtYyA8LSBhcy5mYWN0b3IoQUVEQi5DRUEkc21jKQpzdW1tYXJ5KEFFREIuQ0VBJHNtYykKY29udHJhc3RzKEFFREIuQ0VBJHNtYykKCkFFREIuQ0VBJFNNQ19ncm91cGVkIDwtIGFzLmZhY3RvcihBRURCLkNFQSRzbWMpCgpkZiA8LSBBRURCLkNFQSAlPiUKICBmaWx0ZXIoIWlzLm5hKFNNQ19ncm91cGVkKSkgJT4lCiAgZ3JvdXBfYnkoR2VuZGVyLCBTTUNfZ3JvdXBlZCkgJT4lCnN1bW1hcmlzZShjb3VudHMgPSBuKCkpIAoKZ2dwdWJyOjpnZ2JhcnBsb3QoZGYsIHggPSAiU01DX2dyb3VwZWQiLCB5ID0gImNvdW50cyIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCBsYWIudmp1c3QgPSAyLCBsYWIuY29sID0gIiNGRkZGRkYiLAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlNNQyAoZ3JvdXBlZCkiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU01DIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKcm0oZGYpCgoKIyBJUEgKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpzdW1tYXJ5KEFFREIuQ0VBJElQSC5iaW4pCmNvbnRyYXN0cyhBRURCLkNFQSRJUEguYmluKQoKQUVEQi5DRUEkSVBIIDwtIGFzLmZhY3RvcihBRURCLkNFQSRJUEguYmluKQoKZGYgPC0gQUVEQi5DRUEgJT4lCiAgZmlsdGVyKCFpcy5uYShJUEgpKSAlPiUKICBncm91cF9ieShHZW5kZXIsIElQSCkgJT4lCnN1bW1hcmlzZShjb3VudHMgPSBuKCkpIAoKZ2dwdWJyOjpnZ2JhcnBsb3QoZGYsIHggPSAiSVBIIiwgeSA9ICJjb3VudHMiLAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgbGFiLnZqdXN0ID0gMiwgbGFiLmNvbCA9ICIjRkZGRkZGIiwKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJJbnRyYXBsYXF1ZSBoZW1vcnJoYWdlIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImludHJhcGxhcXVlIGhlbW9ycmhhZ2UiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQpybShkZikKCiMgU3ltcHRvbXMKY2F0KCJTdW1tYXJ5IG9mIGRhdGEuXG4iKQpzdW1tYXJ5KEFFREIuQ0VBJEFzeW1wdFN5bXB0KQpjb250cmFzdHMoQUVEQi5DRUEkQXN5bXB0U3ltcHQpCgpBRURCLkNFQSRBc3ltcHRTeW1wdCA8LSBhcy5mYWN0b3IoQUVEQi5DRUEkQXN5bXB0U3ltcHQpCgpkZiA8LSBBRURCLkNFQSAlPiUKICBmaWx0ZXIoIWlzLm5hKEFzeW1wdFN5bXB0KSkgJT4lCiAgZ3JvdXBfYnkoR2VuZGVyLCBBc3ltcHRTeW1wdCkgJT4lCnN1bW1hcmlzZShjb3VudHMgPSBuKCkpIAoKZ2dwdWJyOjpnZ2JhcnBsb3QoZGYsIHggPSAiQXN5bXB0U3ltcHQiLCB5ID0gImNvdW50cyIsCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCBsYWIudmp1c3QgPSAyLCBsYWIuY29sID0gIiNGRkZGRkYiLAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlN5bXB0b21zIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInN5bXB0b21zIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKcm0oZGYpCgpgYGAKCiMjIyMgQ29ycmVsYXRpb25zIGJldHdlZW4gTUNQMSBwbGFxdWUgbGV2ZWxzIGFuZCBzdXJnZXJ5IHllYXIKCkhlcmUgd2UgY29tcGFyZSB0aGUgTUNQMSBwbGFxdWUgbGV2ZWxzIGZyb20gZXhwZXJpbWVudCAxIHdpdGggdGhvc2UgZXhwZXJpbWVudCAyLiBUaGUgbGF0dGVyIHdlIG1lYXN1cmVkIGluIHBnL21MIGFuZCBhbHNvIGNvcnJlY3RlZCBmb3IgdGhlIHRvdGFsIHByb3RlaW4gY29udGVudCAocGcvdWcpLgoKYGBge3IgTUNQMSBzY2F0dGVyczogeWVhciBvZiBzdXJnZXJ5fQpwMSA8LSBnZ3B1YnI6Omdnc2NhdHRlcihBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiT1J5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJ5ZWFyIG9mIHN1cmdlcnkiLAogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gImV4cGVyaW1lbnQgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscywgSU5ULCBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCnAxIAoKcDIgPC0gZ2dwdWJyOjpnZ3NjYXR0ZXIoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICB4ID0gIk9SeWVhciIsIAogICAgICAgICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfbWxfMjAxNV9yYW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJ5ZWFyIG9mIHN1cmdlcnkiLAogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gImV4cGVyaW1lbnQgMiwgW3BnL21MXSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1DUDEgcGxhcXVlIGxldmVscywgSU5ULCBbcGcvbUxdL1twZy91Z10iLAogICAgICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDIgCgpwMyA8LSBnZ3B1YnI6Omdnc2NhdHRlcihBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiT1J5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMTI5MEQ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gInllYXIgb2Ygc3VyZ2VyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiZXhwZXJpbWVudCAyLCBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFxdWUgbGV2ZWxzLCBJTlQiLAogICAgICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKcDMKCmBgYApJbiB0aGlzIHNlY3Rpb24gd2UgbWFrZSBzb21lIHZhcmlhYmxlcyB0byBhc3Npc3Qgd2l0aCBhbmFseXNpcy4KYGBge3IgQ3Jvc3NTZWM6IHBsYXF1ZXMgLSBzZXR1cCByZWdyZXNzaW9uIH0KQUVEQi5DRUEuc2FtcGxlc2l6ZSA9IG5yb3coQUVEQi5DRUEpCiMgVFJBSVRTLlBST1RFSU4gPSBjKCJJTDZfTE4iLCAiTUNQMV9MTiIsICJJTDZfcGdfdWdfMjAxNV9MTiIsICJJTDZSX3BnX3VnXzIwMTVfTE4iLCAiTUNQMV9wZ191Z18yMDE1X0xOIikKIyBUUkFJVFMuUFJPVEVJTi5SQU5LID0gYygiSUw2X3JhbmsiLCAiTUNQMV9yYW5rIiwgIklMNl9wZ191Z18yMDE1X3JhbmsiLCAiSUw2Ul9wZ191Z18yMDE1X3JhbmsiLCAiTUNQMV9wZ191Z18yMDE1X3JhbmsiKQojIFRSQUlUUy5QUk9URUlOLlJBTksgPSBjKCJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsICJNQ1AxX3JhbmsiKQpUUkFJVFMuUFJPVEVJTi5SQU5LID0gYygiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAiTUNQMV9wZ19tbF8yMDE1X3JhbmsiLCAiTUNQMV9yYW5rIikKCiMgVFJBSVRTLkNPTiA9IGMoIk1hY3JvcGhhZ2VzX0xOIiwgIlNNQ19MTiIsICJWZXNzZWxEZW5zaXR5X0xOIikKIyBUUkFJVFMuQ09OLlJBTksgPSBjKCJNYWNyb3BoYWdlc19yYW5rIikKVFJBSVRTLkNPTi5SQU5LID0gYygiTWFjcm9waGFnZXNfcmFuayIsICJTTUNfcmFuayIsICJWZXNzZWxEZW5zaXR5X3JhbmsiKQoKIyBUUkFJVFMuQklOID0gYygiTUFDX2Jpbm5lZCIpClRSQUlUUy5CSU4gPSBjKCJDYWxjaWZpY2F0aW9uUGxhcXVlIiwgIkNvbGxhZ2VuUGxhcXVlIiwgIkZhdDEwUGVyYyIsICJJUEgiLAogICAgICAgICAgICAgICAiTUFDX2Jpbm5lZCIsICJTTUNfYmlubmVkIikKCgojICJIb3NwaXRhbCIsIAojICJBZ2UiLCAiR2VuZGVyIiwgCiMgIlRDX2ZpbmFsIiwgIkxETF9maW5hbCIsICJIRExfZmluYWwiLCAiVEdfZmluYWwiLCAKIyAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiMgIktET1FJIiwgIkJNSV9XSE8iLAojICJTbW9rZXJDdXJyZW50IiwgImVDaWdhcmV0dGVzIiwgImVQYWNrWWVhcnNTbW9raW5nIiwKIyAiRGlhYmV0ZXNTdGF0dXMiLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsIAojICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAiTWVkLmFudGljb2FndWxhbnRzIiwgIk1lZC5hbGwuYW50aXBsYXRlbGV0IiwgIk1lZC5TdGF0aW4uTExEIiwgCiMgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJyZXN0ZW5vcyIsCiMgIkVQX2NvbXBvc2l0ZSIsICJFUF9jb21wb3NpdGVfdGltZSIsCiMgIm1hY21lYW4wIiwgInNtY21lYW4wIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKIyAibmV1dHJvcGhpbHMiLCAiTWFzdF9jZWxsc19wbGFxdWUiLAojICJJUEguYmluIiwgInZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkIiwKIyAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiMgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIiwKIyAiSUw2X3BnX3VnXzIwMTUiLCAiTUNQMV9wZ191Z18yMDE1IiwgCiMgIlFDMjAxOF9GSUxURVIiLCAiQ0hJUCIsICJTQU1QTEVfVFlQRSIsCiMgIkNBRF9oaXN0b3J5IiwgIlN0cm9rZV9oaXN0b3J5IiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwKIyAic3Rlbm9zZSIKCiMgMS4gIEFnZSAoY29udGludW91cyBpbiAxLXllYXIgaW5jcmVtZW50KS4gW0FnZV0KIyAyLiAgU2V4IChtYWxlIHZzLiBmZW1hbGUpLiBbR2VuZGVyXQojIDMuICBQcmVzZW5jZSBvZiBoeXBlcnRlbnNpb24gYXQgYmFzZWxpbmUgKGRlZmluZWQgZWl0aGVyIGFzIGhpc3Rvcnkgb2YgaHlwZXJ0ZW5zaW9uLCBTQlAg4omlMTQwIG1tIEhnLCBEQlAg4omlOTAgbW0gSGcsIG9yIHByZXNjcmlwdGlvbiBvZiBhbnRpaHlwZXJ0ZW5zaXZlIG1lZGljYXRpb25zKS4gW0h5cGVydGVuc2lvbi5jb21wb3NpdGVdCiMgNC4gIFByZXNlbmNlIG9mIGRpYWJldGVzIG1lbGxpdHVzIGF0IGJhc2VsaW5lIChkZWZpbmVkIGVpdGhlciBhcyBhIGhpc3Rvcnkgb2YgZGlhYmV0ZXMsIGFkbWluaXN0cmF0aW9uIG9mIGdsdWNvc2UgbG93ZXJpbmcgbWVkaWNhdGlvbiwgSGJBMWMg4omlNi41JSwgZmFzdGluZyBnbHVjb3NlIOKJpTEyNiBtZy9kbCwgLm9yIHJhbmRvbSBnbHVjb3NlIGxldmVscyDiiaUyMDAgbWcvZGwpLiBbRGlhYmV0ZXNTdGF0dXNdCiMgNS4gIFNtb2tpbmcgKGN1cnJlbnQsIGV4LSwgbmV2ZXIpLiBbU21va2VyQ3VycmVudF0KIyA2LiAgTERMLUMgbGV2ZWxzIChjb250aW51b3VzKS4gW0xETF9maW5hbF0KIyA3LiAgVXNlIG9mIGxpcGlkLWxvd2VyaW5nIGRydWdzLiBbTWVkLlN0YXRpbi5MTERdCiMgOC4gIFVzZSBvZiBhbnRpcGxhdGVsZXQgZHJ1Z3MuIFtNZWQuYWxsLmFudGlwbGF0ZWxldF0KIyA5LiAgZUdGUiAoY29udGludW91cykuIFtHRlJfTURSRF0KIyAxMC4JQk1JIChjb250aW51b3VzKS4gW0JNSV0KIyAxMS4JSGlzdG9yeSBvZiBjYXJkaW92YXNjdWxhciBkaXNlYXNlIChzdHJva2UsIGNvcm9uYXJ5IGFydGVyeSBkaXNlYXNlLCBwZXJpcGhlcmFsIGFydGVyeSBkaXNlYXNlKS4gW01lZEh4X0NWRF0gY29tYmluYXRpbm8gb2Y6IFtDQURfaGlzdG9yeSwgU3Ryb2tlX2hpc3RvcnksIFBlcmlwaGVyYWwuaW50ZXJ2XQojIDEyLglMZXZlbCBvZiBzdGVub3NpcyAoNTAtNzAlIHZzLiA3MC05OSUpLiBbc3Rlbm9zZV0KCiMgTW9kZWxzIAojIE1vZGVsIDE6IGFkanVzdGVkIGZvciBhZ2UgYW5kIHNleAojIE1vZGVsIDI6IGFkanVzdGVkIGZvciBhZ2UsIHNleCwgaHlwZXJ0ZW5zaW9uLCBkaWFiZXRlcywgc21va2luZywgTERMLUMgbGV2ZWxzLCBsaXBpZC1sb3dlcmluZyBkcnVncywgYW50aXBsYXRlbGV0IGRydWdzLCBlR0ZSLCBCTUksIGhpc3Rvcnkgb2YgQ1ZELCBsZXZlbCBvZiBzdGVub3NpcywKCkFFREIuQ0VBJE9SZGF0ZV9lcG9jaCA8LSBhcy5udW1lcmljKEFFREIuQ0VBJGRhdGVvaykKQUVEQi5DRUEkT1JkYXRlX3llYXIgPC0gYXNfZmFjdG9yKHllYXIoQUVEQi5DRUEkZGF0ZW9rKSkKQ09WQVJJQVRFU19NMSA9IGMoIkFnZSIsICJHZW5kZXIiLCAiT1JkYXRlX3llYXIiKQojIENPVkFSSUFURVNfTTEgPSBjKCJBZ2UiLCAiR2VuZGVyIiwgIk9SZGF0ZV9lcG9jaCIpCgpDT1ZBUklBVEVTX00yID0gYyhDT1ZBUklBVEVTX00xLCAgCiAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAKICAgICAgICAgICAgICAgIyAiU21va2VyQ3VycmVudCIsCiAgICAgICAgICAgICAgICJNZWQuU3RhdGluLkxMRCIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsIAogICAgICAgICAgICAgICAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICMgIkNBRF9oaXN0b3J5IiwgIlN0cm9rZV9oaXN0b3J5IiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICJNZWRIeF9DVkQiLAogICAgICAgICAgICAgICAic3Rlbm9zZSIpCgojIENPVkFSSUFURVNfTTMgPSBjKENPVkFSSUFURVNfTTIsICJMRExfZmluYWwiKQoKIyBDT1ZBUklBVEVTX000ID0gYyhDT1ZBUklBVEVTX00yLCAiaHNDUlBfcGxhc21hIikKCiMgQ09WQVJJQVRFU19NNSA9IGMoQ09WQVJJQVRFU19NMiwgIklMNl9wZ191Z18yMDE1X0xOIikKIyBDT1ZBUklBVEVTX001cmFuayA9IGMoQ09WQVJJQVRFU19NMiwgIklMNl9wZ191Z18yMDE1X3JhbmsiKQoKYGBgCgojIyMgTW9kZWwgMQoKSW4gdGhpcyBtb2RlbCB3ZSBjb3JyZWN0IGZvciBfQWdlXywgX0dlbmRlcl8sIGFuZCBfeWVhciBvZiBzdXJnZXJ5Xy4KCkhlcmUgd2UgdXNlIHRoZSBpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBkYXRhIC0gdmlzdWFsbHkgdGhpcyBpcyBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLgoKIyMjIyBRdWFudGl0YXRpdmUgcGxhcXVlIHRyYWl0cwoKQW5hbHlzaXMgb2YgY29udGludW91cy9xdWFudGl0YXRpdmUgcGxhcXVlIHRyYWl0cyBhcyBhIGZ1bmN0aW9uIG9mIHBsYXNtYS9wbGFxdWUgTUNQMSBsZXZlbHMuCmBgYHtyIENyb3NzU2VjOiBwbGFxdWVzIC0gbGluZWFyIHJlZ3Jlc3Npb24gTU9ERUwxIFJBTkssIGluY2x1ZGU9VFJVRSwgcGFnZWQucHJpbnQ9VFJVRX0KCkdMTS5yZXN1bHRzIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTUsIG5yb3cgPSAwKSkKY2F0KCJSdW5uaW5nIGxpbmVhciByZWdyZXNzaW9uLi4uXG4iKQpmb3IgKHByb3RlaW4gaW4gMTpsZW5ndGgoVFJBSVRTLlBST1RFSU4uUkFOSykpIHsKICBQUk9URUlOID0gVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBmb3IgKHRyYWl0IGluIDE6bGVuZ3RoKFRSQUlUUy5DT04uUkFOSykpIHsKICAgIFRSQUlUID0gVFJBSVRTLkNPTi5SQU5LW3RyYWl0XQogICAgY2F0KHBhc3RlMCgiXG4tIHByb2Nlc3NpbmcgIixUUkFJVCwiXG5cbiIpKQogICAgY3VycmVudERGIDwtIGFzLmRhdGEuZnJhbWUoQUVEQi5DRUEgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QoLiwgUFJPVEVJTiwgVFJBSVQsIENPVkFSSUFURVNfTTEpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKQogICAgIyBmb3IgZGVidWcKICAgICMgcHJpbnQoRFQ6OmRhdGF0YWJsZShjdXJyZW50REYpKQogICAgIyBwcmludChucm93KGN1cnJlbnRERikpCiAgICAjIHByaW50KHN0cihjdXJyZW50REYpKQogICAgIyMjIHVuaXZhcmlhdGUKICAgIGZpdCA8LSBsbShjdXJyZW50REZbLFBST1RFSU5dIH4gY3VycmVudERGWyxUUkFJVF0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfeWVhciwgZGF0YSA9IGN1cnJlbnRERikKICAgIG1vZGVsX3N0ZXAgPC0gc3RlcEFJQyhmaXQsIGRpcmVjdGlvbiA9ICJib3RoIiwgdHJhY2UgPSBGQUxTRSkKICAgIHByaW50KG1vZGVsX3N0ZXApCiAgICBwcmludChzdW1tYXJ5KGZpdCkpCgogICAgR0xNLnJlc3VsdHMuVEVNUCA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE1LCBucm93ID0gMCkpCiAgICBHTE0ucmVzdWx0cy5URU1QWzEsXSA9IEdMTS5DT04oZml0LCAiQUVEQi5DRUEiLCBQUk9URUlOLCBUUkFJVCwgdmVyYm9zZSA9IFRSVUUpCiAgICBHTE0ucmVzdWx0cyA9IHJiaW5kKEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QKQogIH0KfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiVC12YWx1ZSIsICJQLXZhbHVlIiwgInJeMiIsICJyXjJfYWRqIiwgIkFFX04iLCAiTW9kZWxfTiIsICJQZXJjX01pc3MiKQoKY2F0KCJDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKR0xNLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJEJldGEpCkdMTS5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHMuZS5tLikKR0xNLnJlc3VsdHMkT1IgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRPUikKR0xNLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGxvdzk1Q0kpCkdMTS5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHVwOTVDSSkKR0xNLnJlc3VsdHMkYFQtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFQtdmFsdWVgKQpHTE0ucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUC12YWx1ZWApCkdMTS5yZXN1bHRzJGByXjJgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMmApCkdMTS5yZXN1bHRzJGByXjJfYWRqYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfYWRqYCkKR0xNLnJlc3VsdHMkYEFFX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYEFFX05gKQpHTE0ucmVzdWx0cyRgTW9kZWxfTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgTW9kZWxfTmApCkdMTS5yZXN1bHRzJGBQZXJjX01pc3NgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2ApCgojIFNhdmUgdGhlIGRhdGEKY2F0KCJXcml0aW5nIHJlc3VsdHMgdG8gRXhjZWwtZmlsZS4uLlxuIikKIyMjIFVuaXZhcmlhdGUKbGlicmFyeShvcGVueGxzeCkKd3JpdGUueGxzeChHTE0ucmVzdWx0cywKICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLkFFREIuQ0VBLkNvbi5VbmkuUHJvdGVpbi5QbGFxdWVQaGVub3R5cGVzLlJBTksuTU9ERUwxLnhsc3giKSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgc2hlZXROYW1lID0gIkNvbi5VbmkuUGxhcXVlUGhlbm8iKQojIFJlbW92aW5nIGludGVybWVkaWF0ZXMKY2F0KCJSZW1vdmluZyBpbnRlcm1lZGlhdGUgZmlsZXMuLi5cbiIpCnJtKFRSQUlULCB0cmFpdCwgY3VycmVudERGLCBHTE0ucmVzdWx0cywgR0xNLnJlc3VsdHMuVEVNUCwgZml0LCBtb2RlbF9zdGVwKQoKCmBgYAoKIyMjIyBCaW5hcnkgcGxhcXVlIHRyYWl0cwoKQW5hbHlzaXMgb2YgYmluYXJ5IHBsYXF1ZSB0cmFpdHMgYXMgYSBmdW5jdGlvbiBvZiBwbGFzbWEvcGxhcXVlIE1DUDEgbGV2ZWxzLgpgYGB7ciBDcm9zc1NlYzogcGxhcXVlcyAtIGxvZ2lzdGljIHJlZ3Jlc3Npb24gTU9ERUwxIFJBTkssIGluY2x1ZGU9VFJVRSwgcGFnZWQucHJpbnQ9VFJVRX0KCkdMTS5yZXN1bHRzIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTYsIG5yb3cgPSAwKSkKZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0KICBjYXQocGFzdGUwKCJcbkFuYWx5c2lzIG9mICIsUFJPVEVJTiwiLlxuIikpCiAgZm9yICh0cmFpdCBpbiAxOmxlbmd0aChUUkFJVFMuQklOKSkgewogICAgVFJBSVQgPSBUUkFJVFMuQklOW3RyYWl0XQogICAgY2F0KHBhc3RlMCgiXG4tIHByb2Nlc3NpbmcgIixUUkFJVCwiXG5cbiIpKQogICAgY3VycmVudERGIDwtIGFzLmRhdGEuZnJhbWUoQUVEQi5DRUEgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QoLiwgUFJPVEVJTiwgVFJBSVQsIENPVkFSSUFURVNfTTEpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKQogICAgIyBmb3IgZGVidWcKICAgICMgcHJpbnQoRFQ6OmRhdGF0YWJsZShjdXJyZW50REYpKQogICAgIyBwcmludChucm93KGN1cnJlbnRERikpCiAgICAjIHByaW50KHN0cihjdXJyZW50REYpKQogICAgIyBwcmludChjbGFzcyhjdXJyZW50REZbLFRSQUlUXSkpCiAgICAjIyMgdW5pdmFyaWF0ZQogICAgZml0IDwtIGdsbShhcy5mYWN0b3IoY3VycmVudERGWyxUUkFJVF0pIH4gY3VycmVudERGWyxQUk9URUlOXSArIEFnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyLAogICAgICAgICAgICAgIGRhdGEgID0gIGN1cnJlbnRERiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQogICAgbW9kZWxfc3RlcCA8LSBzdGVwQUlDKGZpdCwgZGlyZWN0aW9uID0gImJvdGgiLCB0cmFjZSA9IEZBTFNFKQogICAgcHJpbnQobW9kZWxfc3RlcCkKICAgIHByaW50KHN1bW1hcnkoZml0KSkKICAgIAogICAgR0xNLnJlc3VsdHMuVEVNUCA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE2LCBucm93ID0gMCkpCiAgICBHTE0ucmVzdWx0cy5URU1QWzEsXSA9IEdMTS5CSU4oZml0LCAiQUVEQi5DRUEiLCBQUk9URUlOLCBUUkFJVCwgdmVyYm9zZSA9IFRSVUUpCiAgICBHTE0ucmVzdWx0cyA9IHJiaW5kKEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QKQogIH0KfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiWi12YWx1ZSIsICJQLXZhbHVlIiwgInJeMl9sIiwgInJeMl9jcyIsICJyXjJfbmFnZWxrZXJrZSIsICJBRV9OIiwgIk1vZGVsX04iLCAiUGVyY19NaXNzIikKCmNhdCgiQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkdMTS5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRCZXRhKQpHTE0ucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRzLmUubS4pCkdMTS5yZXN1bHRzJE9SIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkT1IpCkdMTS5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRsb3c5NUNJKQpHTE0ucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyR1cDk1Q0kpCkdMTS5yZXN1bHRzJGBaLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBaLXZhbHVlYCkKR0xNLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFAtdmFsdWVgKQpHTE0ucmVzdWx0cyRgcl4yX2xgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9sYCkKR0xNLnJlc3VsdHMkYHJeMl9jc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yX2NzYCkKR0xNLnJlc3VsdHMkYHJeMl9uYWdlbGtlcmtlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfbmFnZWxrZXJrZWApCkdMTS5yZXN1bHRzJGBBRV9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBBRV9OYCkKR0xNLnJlc3VsdHMkYE1vZGVsX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYE1vZGVsX05gKQpHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQZXJjX01pc3NgKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCgojIyMgVW5pdmFyaWF0ZQp3cml0ZS54bHN4KEdMTS5yZXN1bHRzLAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuQmluLlVuaS5Qcm90ZWluLlBsYXF1ZVBoZW5vdHlwZXMuUkFOSy5NT0RFTDEueGxzeCIpLAogICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQmluLlVuaS5QbGFxdWVQaGVubyIpCgojIFJlbW92aW5nIGludGVybWVkaWF0ZXMKY2F0KCJSZW1vdmluZyBpbnRlcm1lZGlhdGUgZmlsZXMuLi5cbiIpCnJtKFRSQUlULCB0cmFpdCwgY3VycmVudERGLCBHTE0ucmVzdWx0cywgR0xNLnJlc3VsdHMuVEVNUCwgZml0LCBtb2RlbF9zdGVwKQoKYGBgCgoKIyMjIE1vZGVsIDIKCkluIHRoaXMgbW9kZWwgd2UgY29ycmVjdCBmb3IgX0FnZV8sIF9HZW5kZXJfLCBfeWVhciBvZiBzdXJnZXJ5XywgX0h5cGVydGVuc2lvbiBzdGF0dXNfLCBfRGlhYmV0ZXMgc3RhdHVzXywgX2N1cnJlbnQgc21va2VyIHN0YXR1c18sIF9saXBpZC1sb3dlcmluZyBkcnVncyAoTExEcylfLCBfYW50aXBsYXRlbGV0IG1lZGljYXRpb25fLCBfZUdGUiAoTURSRClfLCBfQk1JXywgX01lZEh4X0NWRF8gKGNvbWJpbmF0aW9uIG9mIF9DQUQgaGlzdG9yeV8sIF9zdHJva2UgaGlzdG9yeV8sIGFuZCBfcGVyaXBoZXJhbCBpbnRlcnZlbnRpb25zXyksIGFuZCBfc3Rlbm9zaXNfLgoKSGVyZSB3ZSB1c2UgdGhlIGludmVyc2UtcmFuayBub3JtYWxpemVkIGRhdGEgLSB2aXN1YWxseSB0aGlzIGlzIG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCgojIyMjIFF1YW50aXRhdGl2ZSBwbGFxdWUgdHJhaXRzCgpBbmFseXNpcyBvZiBjb250aW51b3VzL3F1YW50aXRhdGl2ZSBwbGFxdWUgdHJhaXRzIGFzIGEgZnVuY3Rpb24gb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscy4KYGBge3IgQ3Jvc3NTZWM6IHBsYXF1ZXMgLSBsaW5lYXIgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgaW5jbHVkZT1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNSwgbnJvdyA9IDApKQpjYXQoIlJ1bm5pbmcgbGluZWFyIHJlZ3Jlc3Npb24uLi5cbiIpCmZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSkgewogIFBST1RFSU4gPSBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dCiAgY2F0KHBhc3RlMCgiXG5BbmFseXNpcyBvZiAiLFBST1RFSU4sIi5cbiIpKQogIGZvciAodHJhaXQgaW4gMTpsZW5ndGgoVFJBSVRTLkNPTi5SQU5LKSkgewogICAgVFJBSVQgPSBUUkFJVFMuQ09OLlJBTktbdHJhaXRdCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMikgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIyMgdW5pdmFyaWF0ZQogICAgZml0IDwtIGxtKGN1cnJlbnRERlssUFJPVEVJTl0gfiBjdXJyZW50REZbLFRSQUlUXSArIEFnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgCiAgICAgICAgICAgICAgICBIeXBlcnRlbnNpb24uY29tcG9zaXRlICsgRGlhYmV0ZXNTdGF0dXMgKyBTbW9rZXJTdGF0dXMgKyAKICAgICAgICAgICAgICAgIE1lZC5TdGF0aW4uTExEICsgTWVkLmFsbC5hbnRpcGxhdGVsZXQgKyBHRlJfTURSRCArIEJNSSArIAogICAgICAgICAgICAgICAgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgCiAgICAgICAgICAgICAgZGF0YSA9IGN1cnJlbnRERikKICAgIG1vZGVsX3N0ZXAgPC0gc3RlcEFJQyhmaXQsIGRpcmVjdGlvbiA9ICJib3RoIiwgdHJhY2UgPSBGQUxTRSkKICAgIHByaW50KG1vZGVsX3N0ZXApCiAgICBwcmludChzdW1tYXJ5KGZpdCkpCiAgICAKICAgIEdMTS5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNSwgbnJvdyA9IDApKQogICAgR0xNLnJlc3VsdHMuVEVNUFsxLF0gPSBHTE0uQ09OKGZpdCwgIkFFREIuQ0VBIiwgUFJPVEVJTiwgVFJBSVQsIHZlcmJvc2UgPSBUUlVFKQogICAgR0xNLnJlc3VsdHMgPSByYmluZChHTE0ucmVzdWx0cywgR0xNLnJlc3VsdHMuVEVNUCkKICB9Cn0KY2F0KCJFZGl0IHRoZSBjb2x1bW4gbmFtZXMuLi5cbiIpCmNvbG5hbWVzKEdMTS5yZXN1bHRzKSA9IGMoIkRhdGFzZXQiLCAiUHJlZGljdG9yIiwgIlRyYWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJPUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlQtdmFsdWUiLCAiUC12YWx1ZSIsICJyXjIiLCAicl4yX2FkaiIsICJBRV9OIiwgIk1vZGVsX04iLCAiUGVyY19NaXNzIikKCmNhdCgiQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkdMTS5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRCZXRhKQpHTE0ucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRzLmUubS4pCkdMTS5yZXN1bHRzJE9SIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkT1IpCkdMTS5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRsb3c5NUNJKQpHTE0ucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyR1cDk1Q0kpCkdMTS5yZXN1bHRzJGBULXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBULXZhbHVlYCkKR0xNLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFAtdmFsdWVgKQpHTE0ucmVzdWx0cyRgcl4yYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJgKQpHTE0ucmVzdWx0cyRgcl4yX2FkamAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yX2FkamApCkdMTS5yZXN1bHRzJGBBRV9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBBRV9OYCkKR0xNLnJlc3VsdHMkYE1vZGVsX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYE1vZGVsX05gKQpHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQZXJjX01pc3NgKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCiMjIyBVbml2YXJpYXRlCmxpYnJhcnkob3Blbnhsc3gpCndyaXRlLnhsc3goR0xNLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db24uTXVsdGkuUHJvdGVpbi5QbGFxdWVQaGVub3R5cGVzLlJBTksuTU9ERUwyLnhsc3giKSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgc2hlZXROYW1lID0gIkNvbi5NdWx0aS5QbGFxdWVQaGVubyIpCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIHRyYWl0LCBjdXJyZW50REYsIEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QLCBmaXQsIG1vZGVsX3N0ZXApCgoKYGBgCgojIyMjIEJpbmFyeSBwbGFxdWUgdHJhaXRzCgpBbmFseXNpcyBvZiBiaW5hcnkgcGxhcXVlIHRyYWl0cyBhcyBhIGZ1bmN0aW9uIG9mIHBsYXNtYS9wbGFxdWUgTUNQMSBsZXZlbHMuCmBgYHtyIENyb3NzU2VjOiBwbGFxdWVzIC0gbG9naXN0aWMgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgaW5jbHVkZT1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNiwgbnJvdyA9IDApKQpmb3IgKHByb3RlaW4gaW4gMTpsZW5ndGgoVFJBSVRTLlBST1RFSU4uUkFOSykpIHsKICBQUk9URUlOID0gVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBmb3IgKHRyYWl0IGluIDE6bGVuZ3RoKFRSQUlUUy5CSU4pKSB7CiAgICBUUkFJVCA9IFRSQUlUUy5CSU5bdHJhaXRdCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMikgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIHByaW50KGNsYXNzKGN1cnJlbnRERlssVFJBSVRdKSkKICAgICMjIyB1bml2YXJpYXRlCiAgICBmaXQgPC0gZ2xtKGFzLmZhY3RvcihjdXJyZW50REZbLFRSQUlUXSkgfiBjdXJyZW50REZbLFBST1RFSU5dICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX3llYXIgKyAKICAgICAgICAgICAgICAgIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlclN0YXR1cyArIAogICAgICAgICAgICAgICAgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgCiAgICAgICAgICAgICAgICBNZWRIeF9DVkQgKyBzdGVub3NlLCAKICAgICAgICAgICAgICBkYXRhICA9ICBjdXJyZW50REYsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKICAgIG1vZGVsX3N0ZXAgPC0gc3RlcEFJQyhmaXQsIGRpcmVjdGlvbiA9ICJib3RoIiwgdHJhY2UgPSBGQUxTRSkKICAgIHByaW50KG1vZGVsX3N0ZXApCiAgICBwcmludChzdW1tYXJ5KGZpdCkpCiAgICAKICAgIEdMTS5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNiwgbnJvdyA9IDApKQogICAgR0xNLnJlc3VsdHMuVEVNUFsxLF0gPSBHTE0uQklOKGZpdCwgIkFFREIuQ0VBIiwgUFJPVEVJTiwgVFJBSVQsIHZlcmJvc2UgPSBUUlVFKQogICAgR0xNLnJlc3VsdHMgPSByYmluZChHTE0ucmVzdWx0cywgR0xNLnJlc3VsdHMuVEVNUCkKICB9Cn0KY2F0KCJFZGl0IHRoZSBjb2x1bW4gbmFtZXMuLi5cbiIpCmNvbG5hbWVzKEdMTS5yZXN1bHRzKSA9IGMoIkRhdGFzZXQiLCAiUHJlZGljdG9yIiwgIlRyYWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJPUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlotdmFsdWUiLCAiUC12YWx1ZSIsICJyXjJfbCIsICJyXjJfY3MiLCAicl4yX25hZ2Vsa2Vya2UiLCAiQUVfTiIsICJNb2RlbF9OIiwgIlBlcmNfTWlzcyIpCgpjYXQoIkNvcnJlY3QgdGhlIHZhcmlhYmxlIHR5cGVzLi4uXG4iKQpHTE0ucmVzdWx0cyRCZXRhIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkQmV0YSkKR0xNLnJlc3VsdHMkcy5lLm0uIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkcy5lLm0uKQpHTE0ucmVzdWx0cyRPUiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJE9SKQpHTE0ucmVzdWx0cyRsb3c5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkbG93OTVDSSkKR0xNLnJlc3VsdHMkdXA5NUNJIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkdXA5NUNJKQpHTE0ucmVzdWx0cyRgWi12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgWi12YWx1ZWApCkdMTS5yZXN1bHRzJGBQLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQLXZhbHVlYCkKR0xNLnJlc3VsdHMkYHJeMl9sYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfbGApCkdMTS5yZXN1bHRzJGByXjJfY3NgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9jc2ApCkdMTS5yZXN1bHRzJGByXjJfbmFnZWxrZXJrZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yX25hZ2Vsa2Vya2VgKQpHTE0ucmVzdWx0cyRgQUVfTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgQUVfTmApCkdMTS5yZXN1bHRzJGBNb2RlbF9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBNb2RlbF9OYCkKR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCkKCiMgU2F2ZSB0aGUgZGF0YQpjYXQoIldyaXRpbmcgcmVzdWx0cyB0byBFeGNlbC1maWxlLi4uXG4iKQoKIyMjIFVuaXZhcmlhdGUKd3JpdGUueGxzeChHTE0ucmVzdWx0cywKICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLkFFREIuQ0VBLkJpbi5NdWx0aS5Qcm90ZWluLlBsYXF1ZVBoZW5vdHlwZXMuUkFOSy5NT0RFTDIueGxzeCIpLAogICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQmluLk11bHRpLlBsYXF1ZVBoZW5vIikKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIHRyYWl0LCBjdXJyZW50REYsIEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QLCBmaXQsIG1vZGVsX3N0ZXApCgpgYGAKCgojIyBCLiBDcm9zcy1zZWN0aW9uYWwgYW5hbHlzaXMgc3ltcHRvbXMKCldlIHdpbGwgcGVyZm9ybSBhIGNyb3NzLXNlY3Rpb25hbCBhbmFseXNpcyBiZXR3ZWVuIHBsYXF1ZSBhbmQgcGxhc21hIE1DUDEsIElMNiwgYW5kIElMNlIgbGV2ZWxzIGFuZCB0aGUgJ2NsaW5pY2FsIHN0YXR1cycgb2YgdGhlIHBsYXF1ZSBpbiB0ZXJtcyBvZiBwcmVzZW5jZSBvZiBwYXRpZW50cycgc3ltcHRvbXMgKHN5bXB0b21hdGljIHZzLiBhc3ltcHRvbWF0aWMpLiBUaGUgc3ltcHRvbXMgb2YgaW50ZXJlc3QgYXJlOgoKLSBzdHJva2UKLSBUSUEKLSByZXRpbmFsIGluZmFyY3Rpb24KLSBhbWF1cm9zaXMgZnVnYXgKLSBhc3ltcHRvbWF0aWMKCiMjIyBNb2RlbCAxCgpJbiB0aGlzIG1vZGVsIHdlIGNvcnJlY3QgZm9yIF9BZ2VfLCBfR2VuZGVyXywgYW5kIF95ZWFyIG9mIHN1cmdlcnlfLgoKCmBgYHtyIENyb3NzU2VjOiBzeW1wdG9tcyAtIGxvZ2lzdGljIHJlZ3Jlc3Npb24gTU9ERUwxIFJBTkssIGluY2x1ZGU9VFJVRSwgcGFnZWQucHJpbnQ9VFJVRX0KCkdMTS5yZXN1bHRzIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTYsIG5yb3cgPSAwKSkKZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0KICBjYXQocGFzdGUwKCJcbkFuYWx5c2lzIG9mICIsUFJPVEVJTiwiLlxuIikpCiAgVFJBSVQgPSAiQXN5bXB0U3ltcHQiCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMSkgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIHByaW50KGNsYXNzKGN1cnJlbnRERlssVFJBSVRdKSkKICAgICMjIyB1bml2YXJpYXRlCiAgICAgIyArIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlckN1cnJlbnQgKyAKICAgICAjICAgICAgICAgICAgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgCiAgICAgIyAgICAgICAgICAgIENBRF9oaXN0b3J5ICsgU3Ryb2tlX2hpc3RvcnkgKyBQZXJpcGhlcmFsLmludGVydiArIHN0ZW5vc2UKICAgIGZpdCA8LSBnbG0oYXMuZmFjdG9yKGN1cnJlbnRERlssVFJBSVRdKSB+IGN1cnJlbnRERlssUFJPVEVJTl0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfeWVhciwgCiAgICAgICAgICAgICAgZGF0YSAgPSAgY3VycmVudERGLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCiAgICBtb2RlbF9zdGVwIDwtIHN0ZXBBSUMoZml0LCBkaXJlY3Rpb24gPSAiYm90aCIsIHRyYWNlID0gRkFMU0UpCiAgICBwcmludChtb2RlbF9zdGVwKQogICAgcHJpbnQoc3VtbWFyeShmaXQpKQogICAgCiAgICBHTE0ucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTYsIG5yb3cgPSAwKSkKICAgIEdMTS5yZXN1bHRzLlRFTVBbMSxdID0gR0xNLkJJTihmaXQsICJBRURCLkNFQSIsIFBST1RFSU4sIFRSQUlULCB2ZXJib3NlID0gVFJVRSkKICAgIEdMTS5yZXN1bHRzID0gcmJpbmQoR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVApCiAgfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiWi12YWx1ZSIsICJQLXZhbHVlIiwgInJeMl9sIiwgInJeMl9jcyIsICJyXjJfbmFnZWxrZXJrZSIsICJBRV9OIiwgIk1vZGVsX04iLCAiUGVyY19NaXNzIikKCmNhdCgiQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkdMTS5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRCZXRhKQpHTE0ucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRzLmUubS4pCkdMTS5yZXN1bHRzJE9SIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkT1IpCkdMTS5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRsb3c5NUNJKQpHTE0ucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyR1cDk1Q0kpCkdMTS5yZXN1bHRzJGBaLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBaLXZhbHVlYCkKR0xNLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFAtdmFsdWVgKQpHTE0ucmVzdWx0cyRgcl4yX2xgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9sYCkKR0xNLnJlc3VsdHMkYHJeMl9jc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yX2NzYCkKR0xNLnJlc3VsdHMkYHJeMl9uYWdlbGtlcmtlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfbmFnZWxrZXJrZWApCkdMTS5yZXN1bHRzJGBBRV9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBBRV9OYCkKR0xNLnJlc3VsdHMkYE1vZGVsX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYE1vZGVsX05gKQpHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQZXJjX01pc3NgKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCgojIyMgVW5pdmFyaWF0ZQp3cml0ZS54bHN4KEdMTS5yZXN1bHRzLAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuQmluLlVuaS5Qcm90ZWluLlJBTksuU3ltcHRvbXMuTU9ERUwxLnhsc3giKSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgc2hlZXROYW1lID0gIkJpbi5VbmkuU3ltcHRvbXMiKQoKIyBSZW1vdmluZyBpbnRlcm1lZGlhdGVzCmNhdCgiUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQpybShUUkFJVCwgY3VycmVudERGLCBHTE0ucmVzdWx0cywgR0xNLnJlc3VsdHMuVEVNUCwgZml0LCBtb2RlbF9zdGVwKQoKYGBgCgojIyMgTW9kZWwgMgoKSW4gdGhpcyBtb2RlbCB3ZSBjb3JyZWN0IGZvciBfQWdlXywgX0dlbmRlcl8sIF9IeXBlcnRlbnNpb24gc3RhdHVzXywgX0RpYWJldGVzIHN0YXR1c18sIF9jdXJyZW50IHNtb2tlciBzdGF0dXNfLCBfbGlwaWQtbG93ZXJpbmcgZHJ1Z3MgKExMRHMpXywgX2FudGlwbGF0ZWxldCBtZWRpY2F0aW9uXywgX2VHRlIgKE1EUkQpXywgX0JNSV8sIF9NZWRIeF9DVkRfIChjb21iaW5hdGlvbiBvZiBfQ0FEIGhpc3RvcnlfLCBfc3Ryb2tlIGhpc3RvcnlfLCBhbmQgX3BlcmlwaGVyYWwgaW50ZXJ2ZW50aW9uc18pLCBhbmQgX3N0ZW5vc2lzLl8uCgoKYGBge3IgQ3Jvc3NTZWM6IHN5bXB0b21zIC0gbG9naXN0aWMgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgaW5jbHVkZT1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNiwgbnJvdyA9IDApKQpmb3IgKHByb3RlaW4gaW4gMTpsZW5ndGgoVFJBSVRTLlBST1RFSU4uUkFOSykpIHsKICBQUk9URUlOID0gVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBUUkFJVCA9ICJBc3ltcHRTeW1wdCIKICAgIGNhdChwYXN0ZTAoIlxuLSBwcm9jZXNzaW5nICIsVFJBSVQsIlxuXG4iKSkKICAgIGN1cnJlbnRERiA8LSBhcy5kYXRhLmZyYW1lKEFFREIuQ0VBICU+JQogICAgICBkcGx5cjo6c2VsZWN0KC4sIFBST1RFSU4sIFRSQUlULCBDT1ZBUklBVEVTX00yKSAlPiUKICAgICAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSkgJT4lCiAgICAgIGZpbHRlcl9pZih+aXMubnVtZXJpYyguKSwgYWxsX3ZhcnMoIWlzLmluZmluaXRlKC4pKSkKICAgICMgZm9yIGRlYnVnCiAgICAjIHByaW50KERUOjpkYXRhdGFibGUoY3VycmVudERGKSkKICAgICMgcHJpbnQobnJvdyhjdXJyZW50REYpKQogICAgIyBwcmludChzdHIoY3VycmVudERGKSkKICAgICMgcHJpbnQoY2xhc3MoY3VycmVudERGWyxUUkFJVF0pKQogICAgIyMjIHVuaXZhcmlhdGUKCiAgICBmaXQgPC0gZ2xtKGFzLmZhY3RvcihjdXJyZW50REZbLFRSQUlUXSkgfiBjdXJyZW50REZbLFBST1RFSU5dICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX3llYXIgKyAKICAgICAgICAgICAgICAgICBIeXBlcnRlbnNpb24uY29tcG9zaXRlICsgRGlhYmV0ZXNTdGF0dXMgKyBTbW9rZXJTdGF0dXMgKyAKICAgICAgICAgICAgICAgICBNZWQuU3RhdGluLkxMRCArIE1lZC5hbGwuYW50aXBsYXRlbGV0ICsgR0ZSX01EUkQgKyBCTUkgKyAKICAgICAgICAgICAgICAgICBNZWRIeF9DVkQgKyBzdGVub3NlLCAKICAgICAgICAgICAgICAgZGF0YSAgPSAgY3VycmVudERGLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCiAgICBtb2RlbF9zdGVwIDwtIHN0ZXBBSUMoZml0LCBkaXJlY3Rpb24gPSAiYm90aCIsIHRyYWNlID0gRkFMU0UpCiAgICBwcmludChtb2RlbF9zdGVwKQogICAgcHJpbnQoc3VtbWFyeShmaXQpKQogICAgCiAgICBHTE0ucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTYsIG5yb3cgPSAwKSkKICAgIEdMTS5yZXN1bHRzLlRFTVBbMSxdID0gR0xNLkJJTihmaXQsICJBRURCLkNFQSIsIFBST1RFSU4sIFRSQUlULCB2ZXJib3NlID0gVFJVRSkKICAgIEdMTS5yZXN1bHRzID0gcmJpbmQoR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVApCiAgfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiWi12YWx1ZSIsICJQLXZhbHVlIiwgInJeMl9sIiwgInJeMl9jcyIsICJyXjJfbmFnZWxrZXJrZSIsICJBRV9OIiwgIk1vZGVsX04iLCAiUGVyY19NaXNzIikKCmNhdCgiQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkdMTS5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRCZXRhKQpHTE0ucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRzLmUubS4pCkdMTS5yZXN1bHRzJE9SIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkT1IpCkdMTS5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRsb3c5NUNJKQpHTE0ucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyR1cDk1Q0kpCkdMTS5yZXN1bHRzJGBaLXZhbHVlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBaLXZhbHVlYCkKR0xNLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFAtdmFsdWVgKQpHTE0ucmVzdWx0cyRgcl4yX2xgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMl9sYCkKR0xNLnJlc3VsdHMkYHJeMl9jc2AgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgcl4yX2NzYCkKR0xNLnJlc3VsdHMkYHJeMl9uYWdlbGtlcmtlYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfbmFnZWxrZXJrZWApCkdMTS5yZXN1bHRzJGBBRV9OYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBBRV9OYCkKR0xNLnJlc3VsdHMkYE1vZGVsX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYE1vZGVsX05gKQpHTE0ucmVzdWx0cyRgUGVyY19NaXNzYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGBQZXJjX01pc3NgKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCgojIyMgVW5pdmFyaWF0ZQp3cml0ZS54bHN4KEdMTS5yZXN1bHRzLAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuQmluLk11bHRpLlByb3RlaW4uUkFOSy5TeW1wdG9tcy5NT0RFTDIueGxzeCIpLAogICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQmluLk11bHRpLlN5bXB0b21zIikKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIGN1cnJlbnRERiwgR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVAsIGZpdCwgbW9kZWxfc3RlcCkKCmBgYAoKCiMjIEMuIExvbmdpdHVkaW5hbCBhbmFseXNpcyBzZWNvbmRhcnkgY2xpbmljYWwgb3V0Y29tZQoKRm9yIHRoZSBsb25naXR1ZGluYWwgYW5hbHlzZXMgb2YgcGxhcXVlIGFuZCBwbGFzbWEgTUNQMSwgSUw2LCBhbmQgSUw2UiBsZXZlbHMgYW5kIHNlY29uZGFyeSBjYXJkaW92YXNjdWxhciBldmVudHMgb3ZlciBhIHRocmVlLXllYXIgZm9sbG93LXVwIHBlcmlvZC4gCgpUaGUgX3ByaW1hcnkgb3V0Y29tZV8gaXMgZGVmaW5lZCBhcyAiYSBjb21wb3NpdGUgb2YgZmF0YWwgb3Igbm9uLWZhdGFsIG15b2NhcmRpYWwgaW5mYXJjdGlvbiwgZmF0YWwgb3Igbm9uLWZhdGFsIHN0cm9rZSwgcnVwdHVyZWQgYW9ydGljIGFuZXVyeXNtLCBmYXRhbCBjYXJkaWFjIGZhaWx1cmUsIGNvcm9uYXJ5IG9yIHBlcmlwaGVyYWwgaW50ZXJ2ZW50aW9ucywgbGVnIGFtcHV0YXRpb24gZHVlIHRvIHZhc2N1bGFyIGNhdXNlcywgYW5kIGNhcmRpb3Zhc2N1bGFyIGRlYXRoIiwgaS5lLiBtYWpvciBhZHZlcnNlIGNhcmRpb3Zhc2N1bGFyIGV2ZW50cyAoTUFDRSkuIFZhcmlhYmxlOiBgZXBtYWpvci4zeWVhcnNgLCB0aGVzZSBpbmNsdWRlOgotIG15b2NhcmRpYWwgaW5mYXJjdGlvbiAoTUkpCi0gY2VyZWJyYWwgaW5mYXJjdGlvbiAoQ1ZBL3N0cm9rZSkKLSBjYXJkaW92YXNjdWxhciBkZWF0aCAoZXhhY3QgY2F1c2UgdG8gYmUgaW52ZXN0aWdhdGVkKQotIGNlcmVicmFsIGJsZWVkaW5nIChDVkEvc3Ryb2tlKQotIGZhdGFsIG15b2NhcmRpYWwgaW5mYXJjdGlvbiAoTUkpCi0gZmF0YWwgY2VyZWJyYWwgaW5mYXJjdGlvbgotIGZhdGFsIGNlcmVicmFsIGJsZWVkaW5nCi0gc3VkZGVuIGRlYXRoCi0gZmF0YWwgaGVhcnQgZmFpbHVyZQotIGZhdGFsIGFuZXVyeXNtIHJ1cHR1cmUKLSBvdGhlciBjYXJkaW92YXNjdWxhciBkZWF0aC4uCgpUaGUgX3NlY29uZGFyeSBvdXRjb21lc18gd2lsbCBiZSAKCi0gaW5jaWRlbmNlIG9mIGZhdGFsIG9yIG5vbi1mYXRhbCBzdHJva2UgKGlzY2hlbWljIGFuZCBibGVlZGluZykgLSB2YXJpYWJsZTogYGVwc3Ryb2tlLjN5ZWFyc2AsIHRoZXNlIGluY2x1ZGU6CiAgLSBjZXJlYnJhbCBpbmZhcmN0aW9uIChDVkEvc3Ryb2tlKQogIC0gY2VyZWJyYWwgYmxlZWRpbmcgKENWQS9zdHJva2UpCiAgLSBmYXRhbCBjZXJlYnJhbCBpbmZhcmN0aW9uCiAgLSBmYXRhbCBjZXJlYnJhbCBibGVlZGluZy4KLSBpbmNpZGVuY2Ugb2YgYWN1dGUgY29yb25hcnkgZXZlbnRzIChmYXRhbCBvciBub24tZmF0YWwgbXlvY2FyZGlhbCBpbmZhcmN0aW9uLCBjb3JvbmFyeSBpbnRlcnZlbnRpb25zKSAtIHZhcmlhYmxlOiBgZXBjb3JvbmFyeS4zeWVhcnNgLCB0aGVzZSBpbmNsdWRlOgogIC0gbXlvY2FyZGlhbCBpbmZhcmN0aW9uIChNSSkKICAtIGNvcm9uYXJ5IGFuZ2lvcGxhc3R5IChQQ0kvUFRDQSkKICAtIGNhcmRpb3Zhc2N1bGFyIGRlYXRoIChleGFjdCBjYXVzZSB0byBiZSBpbnZlc3RpZ2F0ZWQpCiAgLSBjb3JvbmFyeSBieXBhc3MgKENBQkcpCiAgLSBmYXRhbCBteW9jYXJkaWFsIGluZmFyY3Rpb24gKE1JKQogIC0gc3VkZGVuIGRlYXRoLgotIGNhcmRpb3Zhc2N1bGFyIGRlYXRoIC0gdmFyaWFibGU6IGBlcGN2ZGVhdGguM3llYXJzYCwgdGhlc2UgaW5jbHVkZToKICAtIGNhcmRpb3Zhc2N1bGFyIGRlYXRoIChleGFjdCBjYXVzZSB0byBiZSBpbnZlc3RpZ2F0ZWQpCiAgLSBmYXRhbCBteW9jYXJkaWFsIGluZmFyY3Rpb24gKE1JKQogIC0gZmF0YWwgY2VyZWJyYWwgaW5mYXJjdGlvbgogIC0gZmF0YWwgY2VyZWJyYWwgYmxlZWRpbmcKICAtIHN1ZGRlbiBkZWF0aAogIC0gZmF0YWwgaGVhcnQgZmFpbHVyZQogIC0gZmF0YWwgYW5ldXJ5c20gcnVwdHVyZQogIC0gb3RoZXIgY2FyZGlvdmFzY3VsYXIgZGVhdGguLgoKIyMjIDMwLSBhbmQgOTAtZGF5cyBGVSBldmVudHMKCldlIHdpbGwgdXNlIDMteWVhciBmb2xsb3ctdXAsIGJ1dCB3ZSB3aWxsIGFsc28gY2FsY3VsYXRlIDMwIGRheXMgYW5kIDkwIGRheXMgZm9sbG93LXVwICd0aW1lLXRvLWV2ZW50JyB2YXJpYWJsZXMuIE9uIGF2ZXJhZ2UgdGhlcmUgYXJlIDM2NS4yNSBkYXlzIGluIGEgeWVhci4gV2UgY2FuIGNhbGN1bGF0ZSAzMC1kYXlzIGFuZCA5MC1kYXlzIGZvbGxvdy11cCB0aW1lIGJhc2VkIG9uIHRoZSB0aHJlZSB5ZWFycyBmb2xsb3ctdXAuIAoKYGBge3IgQ2FsY3VsYXRlIG5ldyBGVSBjdXQtb2ZmczogbWF4aW11bSBGVX0KY3V0dC5vZmYuMzBkYXlzID0gKDEvMzY1LjI1KSAqIDMwCmN1dHQub2ZmLjkwZGF5cyA9ICgxLzM2NS4yNSkgKiA5MAoKIyBGaXggbWF4aW11bSBGVSBvZiAzMCBhbmQgOTAgZGF5cwpBRURCIDwtIEFFREIgJT4lCiAgbXV0YXRlKAogICAgRlUuY3V0dC5vZmYuMzBkYXlzID0gaWZlbHNlKG1heC5mb2xsb3d1cCA8PSBjdXR0Lm9mZi4zMGRheXMsIG1heC5mb2xsb3d1cCwgY3V0dC5vZmYuMzBkYXlzKSwKICAgIEZVLmN1dHQub2ZmLjkwZGF5cyA9IGlmZWxzZShtYXguZm9sbG93dXAgPD0gY3V0dC5vZmYuOTBkYXlzLCBtYXguZm9sbG93dXAsIGN1dHQub2ZmLjkwZGF5cykKICApIAoKQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXguZm9sbG93dXAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlUuY3V0dC5vZmYuM3llYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlUuY3V0dC5vZmYuMzBkYXlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZVLmN1dHQub2ZmLjkwZGF5cyIpKQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQpBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCgpEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQoKcm0oQUVEQi50ZW1wKQoKQUVEQi5DRUEgPC0gQUVEQi5DRUEgJT4lCiAgbXV0YXRlKAogICAgRlUuY3V0dC5vZmYuMzBkYXlzID0gaWZlbHNlKG1heC5mb2xsb3d1cCA8PSBjdXR0Lm9mZi4zMGRheXMsIG1heC5mb2xsb3d1cCwgY3V0dC5vZmYuMzBkYXlzKSwKICAgIEZVLmN1dHQub2ZmLjkwZGF5cyA9IGlmZWxzZShtYXguZm9sbG93dXAgPD0gY3V0dC5vZmYuOTBkYXlzLCBtYXguZm9sbG93dXAsIGN1dHQub2ZmLjkwZGF5cykKICApIAoKQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC5mb2xsb3d1cCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVS5jdXR0Lm9mZi4zeWVhcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVS5jdXR0Lm9mZi4zMGRheXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlUuY3V0dC5vZmYuOTBkYXlzIikpCnJlcXVpcmUobGFiZWxsZWQpCkFFREIuQ0VBLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLkNFQS50ZW1wJEdlbmRlcikKQUVEQi5DRUEudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi5DRUEudGVtcCRIb3NwaXRhbCkKQUVEQi5DRUEudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi5DRUEudGVtcCRBcnRlcnlfc3VtbWFyeSkKCkRUOjpkYXRhdGFibGUoQUVEQi5DRUEudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi5DRUEuIiwgcm93bmFtZXMgPSBGQUxTRSkKCnJtKEFFREIuQ0VBLnRlbXApCgoKYGBgCgpIZXJlIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBuZXcgMzAtIGFuZCA5MC1kYXlzIGZvbGxvdy11cCBvZiB0aGUgZXZlbnRzIGFuZCB0aGVpciBldmVudC10aW1lcyBvZiBpbnRlcmVzdDoKCi0gTUFDRSAoYGVwbWFqb3IuM3llYXJzYCkKLSBTdHJva2UgKGBlcHN0cm9rZS4zeWVhcnNgKQotIENvcm9uYXJ5IGV2ZW50cyAoYGVwY29yb25hcnkuM3llYXJzYCkKLSBDYXJkaW92YXNjdWxhciBkZWF0aCAoYGVwY3ZkZWF0aC4zeWVhcnNgKQoKCmBgYHtyIENhbGN1bGF0ZSBuZXcgRlUgY3V0LW9mZnM6IHRpbWVzfQphdmdfZGF5c19pbl95ZWFyID0gMzY1LjI1CmN1dHQub2ZmLjMwZGF5cy5zY2FsZWQgPC0gY3V0dC5vZmYuMzBkYXlzICogMzY1LjI1CmN1dHQub2ZmLjkwZGF5cy5zY2FsZWQgPC0gY3V0dC5vZmYuOTBkYXlzICogMzY1LjI1CiMgRXZlbnQgdGltZXMKQUVEQiA8LSBBRURCICU+JQogIG11dGF0ZSgKICAgIGVwX21ham9yX3RfMzBkYXlzID0gaWZlbHNlKGVwX21ham9yX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX21ham9yX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9zdHJva2VfdF8zMGRheXMgPSBpZmVsc2UoZXBfc3Ryb2tlX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9zdHJva2VfdF8zeWVhcnMgKiBhdmdfZGF5c19pbl95ZWFyLCBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkKSwKICAgIGVwX2Nvcm9uYXJ5X3RfMzBkYXlzID0gaWZlbHNlKGVwX2Nvcm9uYXJ5X3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2Nvcm9uYXJ5X3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9jdmRlYXRoX3RfMzBkYXlzID0gaWZlbHNlKGVwX2N2ZGVhdGhfdF8zeWVhcnMgKiBhdmdfZGF5c19pbl95ZWFyIDw9IGN1dHQub2ZmLjMwZGF5cy5zY2FsZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9jdmRlYXRoX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9tYWpvcl90XzkwZGF5cyA9IGlmZWxzZShlcF9tYWpvcl90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9tYWpvcl90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpLAogICAgZXBfc3Ryb2tlX3RfOTBkYXlzID0gaWZlbHNlKGVwX3N0cm9rZV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfc3Ryb2tlX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCksCiAgICBlcF9jb3JvbmFyeV90XzkwZGF5cyA9IGlmZWxzZShlcF9jb3JvbmFyeV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9jb3JvbmFyeV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpLAogICAgZXBfY3ZkZWF0aF90XzkwZGF5cyA9IGlmZWxzZShlcF9jdmRlYXRoX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi45MGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfY3ZkZWF0aF90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpCiAgKSAKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JQogIG11dGF0ZSgKICAgIGVwX21ham9yX3RfMzBkYXlzID0gaWZlbHNlKGVwX21ham9yX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX21ham9yX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9zdHJva2VfdF8zMGRheXMgPSBpZmVsc2UoZXBfc3Ryb2tlX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9zdHJva2VfdF8zeWVhcnMgKiBhdmdfZGF5c19pbl95ZWFyLCBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkKSwKICAgIGVwX2Nvcm9uYXJ5X3RfMzBkYXlzID0gaWZlbHNlKGVwX2Nvcm9uYXJ5X3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi4zMGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2Nvcm9uYXJ5X3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9jdmRlYXRoX3RfMzBkYXlzID0gaWZlbHNlKGVwX2N2ZGVhdGhfdF8zeWVhcnMgKiBhdmdfZGF5c19pbl95ZWFyIDw9IGN1dHQub2ZmLjMwZGF5cy5zY2FsZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9jdmRlYXRoX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuMzBkYXlzLnNjYWxlZCksCiAgICBlcF9tYWpvcl90XzkwZGF5cyA9IGlmZWxzZShlcF9tYWpvcl90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9tYWpvcl90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpLAogICAgZXBfc3Ryb2tlX3RfOTBkYXlzID0gaWZlbHNlKGVwX3N0cm9rZV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfc3Ryb2tlX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciwgY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCksCiAgICBlcF9jb3JvbmFyeV90XzkwZGF5cyA9IGlmZWxzZShlcF9jb3JvbmFyeV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIgPD0gY3V0dC5vZmYuOTBkYXlzLnNjYWxlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9jb3JvbmFyeV90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpLAogICAgZXBfY3ZkZWF0aF90XzkwZGF5cyA9IGlmZWxzZShlcF9jdmRlYXRoX3RfM3llYXJzICogYXZnX2RheXNfaW5feWVhciA8PSBjdXR0Lm9mZi45MGRheXMuc2NhbGVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfY3ZkZWF0aF90XzN5ZWFycyAqIGF2Z19kYXlzX2luX3llYXIsIGN1dHQub2ZmLjkwZGF5cy5zY2FsZWQpCiAgKSAKCmBgYAoKCmBgYHtyIENveC1yZWdyZXNzaW9uczogbmV3IHRpbWVzfQoKYXR0YWNoKEFFREIpCkFFREJbLCJlcG1ham9yLjMwZGF5cyJdIDwtIEFFREIkZXBtYWpvci4zeWVhcnMKQUVEQiRlcG1ham9yLjMwZGF5c1tlcG1ham9yLjN5ZWFycyA9PSAxICYgZXBfbWFqb3JfdF8zeWVhcnMgPiBjdXR0Lm9mZi4zMGRheXNdIDwtIDAKCkFFREJbLCJlcHN0cm9rZS4zMGRheXMiXSA8LSBBRURCJGVwc3Ryb2tlLjN5ZWFycwpBRURCJGVwc3Ryb2tlLjMwZGF5c1tlcHN0cm9rZS4zeWVhcnMgPT0gMSAmIGVwX3N0cm9rZV90XzN5ZWFycyA+IGN1dHQub2ZmLjMwZGF5c10gPC0gMAoKQUVEQlssImVwY29yb25hcnkuMzBkYXlzIl0gPC0gQUVEQiRlcGNvcm9uYXJ5LjN5ZWFycwpBRURCJGVwY29yb25hcnkuMzBkYXlzW2VwY29yb25hcnkuM3llYXJzID09IDEgJiBlcF9jb3JvbmFyeV90XzN5ZWFycyA+IGN1dHQub2ZmLjMwZGF5c10gPC0gMAoKQUVEQlssImVwY3ZkZWF0aC4zMGRheXMiXSA8LSBBRURCJGVwY3ZkZWF0aC4zeWVhcnMKQUVEQiRlcGN2ZGVhdGguMzBkYXlzW2VwY3ZkZWF0aC4zeWVhcnMgPT0gMSAmIGVwX2N2ZGVhdGhfdF8zeWVhcnMgPiBjdXR0Lm9mZi4zMGRheXNdIDwtIDAKCkFFREJbLCJlcG1ham9yLjkwZGF5cyJdIDwtIEFFREIkZXBtYWpvci4zeWVhcnMKQUVEQiRlcG1ham9yLjkwZGF5c1tlcG1ham9yLjN5ZWFycyA9PSAxICYgZXBfbWFqb3JfdF8zeWVhcnMgPiBjdXR0Lm9mZi45MGRheXNdIDwtIDAKCkFFREJbLCJlcHN0cm9rZS45MGRheXMiXSA8LSBBRURCJGVwc3Ryb2tlLjN5ZWFycwpBRURCJGVwc3Ryb2tlLjkwZGF5c1tlcHN0cm9rZS4zeWVhcnMgPT0gMSAmIGVwX3N0cm9rZV90XzN5ZWFycyA+IGN1dHQub2ZmLjkwZGF5c10gPC0gMAoKQUVEQlssImVwY29yb25hcnkuOTBkYXlzIl0gPC0gQUVEQiRlcGNvcm9uYXJ5LjN5ZWFycwpBRURCJGVwY29yb25hcnkuOTBkYXlzW2VwY29yb25hcnkuM3llYXJzID09IDEgJiBlcF9jb3JvbmFyeV90XzN5ZWFycyA+IGN1dHQub2ZmLjkwZGF5c10gPC0gMAoKQUVEQlssImVwY3ZkZWF0aC45MGRheXMiXSA8LSBBRURCJGVwY3ZkZWF0aC4zeWVhcnMKQUVEQiRlcGN2ZGVhdGguOTBkYXlzW2VwY3ZkZWF0aC4zeWVhcnMgPT0gMSAmIGVwX2N2ZGVhdGhfdF8zeWVhcnMgPiBjdXR0Lm9mZi45MGRheXNdIDwtIDAKCmRldGFjaChBRURCKQoKQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcG1ham9yLjN5ZWFycyIsICJlcHN0cm9rZS4zeWVhcnMiLCAiZXBjb3JvbmFyeS4zeWVhcnMiLCAiZXBjdmRlYXRoLjN5ZWFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwbWFqb3IuMzBkYXlzIiwgImVwc3Ryb2tlLjMwZGF5cyIsICJlcGNvcm9uYXJ5LjMwZGF5cyIsICJlcGN2ZGVhdGguMzBkYXlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBtYWpvci45MGRheXMiLCAiZXBzdHJva2UuOTBkYXlzIiwgImVwY29yb25hcnkuOTBkYXlzIiwgImVwY3ZkZWF0aC45MGRheXMiKSkKcmVxdWlyZShsYWJlbGxlZCkKQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCkFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQoKRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKCnJtKEFFREIudGVtcCkKCmF0dGFjaChBRURCLkNFQSkKQUVEQi5DRUFbLCJlcG1ham9yLjMwZGF5cyJdIDwtIEFFREIuQ0VBJGVwbWFqb3IuM3llYXJzCkFFREIuQ0VBJGVwbWFqb3IuMzBkYXlzW2VwbWFqb3IuM3llYXJzID09IDEgJiBlcF9tYWpvcl90XzN5ZWFycyA+IGN1dHQub2ZmLjMwZGF5c10gPC0gMAoKQUVEQi5DRUFbLCJlcHN0cm9rZS4zMGRheXMiXSA8LSBBRURCLkNFQSRlcHN0cm9rZS4zeWVhcnMKQUVEQi5DRUEkZXBzdHJva2UuMzBkYXlzW2Vwc3Ryb2tlLjN5ZWFycyA9PSAxICYgZXBfc3Ryb2tlX3RfM3llYXJzID4gY3V0dC5vZmYuMzBkYXlzXSA8LSAwCgpBRURCLkNFQVssImVwY29yb25hcnkuMzBkYXlzIl0gPC0gQUVEQi5DRUEkZXBjb3JvbmFyeS4zeWVhcnMKQUVEQi5DRUEkZXBjb3JvbmFyeS4zMGRheXNbZXBjb3JvbmFyeS4zeWVhcnMgPT0gMSAmIGVwX2Nvcm9uYXJ5X3RfM3llYXJzID4gY3V0dC5vZmYuMzBkYXlzXSA8LSAwCgpBRURCLkNFQVssImVwY3ZkZWF0aC4zMGRheXMiXSA8LSBBRURCLkNFQSRlcGN2ZGVhdGguM3llYXJzCkFFREIuQ0VBJGVwY3ZkZWF0aC4zMGRheXNbZXBjdmRlYXRoLjN5ZWFycyA9PSAxICYgZXBfY3ZkZWF0aF90XzN5ZWFycyA+IGN1dHQub2ZmLjMwZGF5c10gPC0gMAoKQUVEQi5DRUFbLCJlcG1ham9yLjkwZGF5cyJdIDwtIEFFREIuQ0VBJGVwbWFqb3IuM3llYXJzCkFFREIuQ0VBJGVwbWFqb3IuOTBkYXlzW2VwbWFqb3IuM3llYXJzID09IDEgJiBlcF9tYWpvcl90XzN5ZWFycyA+IGN1dHQub2ZmLjkwZGF5c10gPC0gMAoKQUVEQi5DRUFbLCJlcHN0cm9rZS45MGRheXMiXSA8LSBBRURCLkNFQSRlcHN0cm9rZS4zeWVhcnMKQUVEQi5DRUEkZXBzdHJva2UuOTBkYXlzW2Vwc3Ryb2tlLjN5ZWFycyA9PSAxICYgZXBfc3Ryb2tlX3RfM3llYXJzID4gY3V0dC5vZmYuOTBkYXlzXSA8LSAwCgpBRURCLkNFQVssImVwY29yb25hcnkuOTBkYXlzIl0gPC0gQUVEQi5DRUEkZXBjb3JvbmFyeS4zeWVhcnMKQUVEQi5DRUEkZXBjb3JvbmFyeS45MGRheXNbZXBjb3JvbmFyeS4zeWVhcnMgPT0gMSAmIGVwX2Nvcm9uYXJ5X3RfM3llYXJzID4gY3V0dC5vZmYuOTBkYXlzXSA8LSAwCgpBRURCLkNFQVssImVwY3ZkZWF0aC45MGRheXMiXSA8LSBBRURCLkNFQSRlcGN2ZGVhdGguM3llYXJzCkFFREIuQ0VBJGVwY3ZkZWF0aC45MGRheXNbZXBjdmRlYXRoLjN5ZWFycyA9PSAxICYgZXBfY3ZkZWF0aF90XzN5ZWFycyA+IGN1dHQub2ZmLjkwZGF5c10gPC0gMAoKZGV0YWNoKEFFREIuQ0VBKQoKQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwbWFqb3IuM3llYXJzIiwgImVwc3Ryb2tlLjN5ZWFycyIsICJlcGNvcm9uYXJ5LjN5ZWFycyIsICJlcGN2ZGVhdGguM3llYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBtYWpvci4zMGRheXMiLCAiZXBzdHJva2UuMzBkYXlzIiwgImVwY29yb25hcnkuMzBkYXlzIiwgImVwY3ZkZWF0aC4zMGRheXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcG1ham9yLjkwZGF5cyIsICJlcHN0cm9rZS45MGRheXMiLCAiZXBjb3JvbmFyeS45MGRheXMiLCAiZXBjdmRlYXRoLjkwZGF5cyIpKQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCLkNFQS50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi5DRUEudGVtcCRHZW5kZXIpCkFFREIuQ0VBLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIuQ0VBLnRlbXAkSG9zcGl0YWwpCkFFREIuQ0VBLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIuQ0VBLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCgpEVDo6ZGF0YXRhYmxlKEFFREIuQ0VBLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuQ0VBLiIsIHJvd25hbWVzID0gRkFMU0UpCgpybShBRURCLkNFQS50ZW1wKQoKCgpgYGAKCiMjIyBTYW5pdHkgY2hlY2tzCgpGaXJzdCB3ZSBkbyBzb21lIHNhbml0eSBjaGVja3MgYW5kIGludmVudG9yeSB0aGUgdGltZS10by1ldmVudCBhbmQgZXZlbnQgdmFyaWFibGVzLgpgYGB7ciBDb3gtcmVncmVzc2lvbnM6IEdlbmVyYWx9CiMgUmVmZXJlbmNlOiBodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvZGV2ZWwvYmlvYy92aWduZXR0ZXMvTXVsdGlBc3NheUV4cGVyaW1lbnQvaW5zdC9kb2MvUXVpY2tTdGFydE11bHRpQXNzYXkuaHRtbAojIElmIHlvdSB3YW50IHRvIHN1cHByZXNzIHdhcm5pbmdzIGFuZCBtZXNzYWdlcyB3aGVuIGluc3RhbGxpbmcvbG9hZGluZyBwYWNrYWdlcwojIHN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7fSkKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJzdXJ2aXZhbCIpCmluc3RhbGwucGFja2FnZXMuYXV0bygic3Vydm1pbmVyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJIbWlzYyIpCgpjYXQoIiogQ3JlYXRpbmcgZnVuY3Rpb24gdG8gc3VtbWFyaXplIENveCByZWdyZXNzaW9uIGFuZCBwcmVwYXJlIGNvbnRhaW5lciBmb3IgcmVzdWx0cy4iKQojIEZ1bmN0aW9uIHRvIGdldCBzdW1tYXJ5IHN0YXRpc3RpY3MgZnJvbSBDb3ggcmVncmVzc2lvbiBtb2RlbApDT1guU1RBVCA8LSBmdW5jdGlvbihjb3hmaXQsIERBVEFTRVQsIE9VVENPTUUsIHByb3RlaW4pewogIGNhdCgiU3VtbWFyaXppbmcgQ294IHJlZ3Jlc3Npb24gcmVzdWx0cyBmb3IgJyIsIHByb3RlaW4gLCInIGFuZCBpdHMgYXNzb2NpYXRpb24gdG8gJyIsT1VUQ09NRSwiJyBpbiAnIixEQVRBU0VULCInLlxuIikKICBpZiAobnJvdyhzdW1tYXJ5KGNveGZpdCkkY29lZmZpY2llbnRzKSA9PSAxKSB7CiAgICBvdXRwdXQgPSBjKHByb3RlaW4sIHJlcChOQSw4KSkKICAgIGNhdCgiTW9kZWwgbm90IGZpdHRlZDsgcHJvYmFibHkgc2luZ3VsYXIuXG4iKQogIH1lbHNlIHsKICAgIGNhdCgiQ29sbGVjdGluZyBkYXRhLlxuXG4iKQogICAgY294LnN1bSA8LSBzdW1tYXJ5KGNveGZpdCkKICAgIGNveC5lZmZlY3RzaXplID0gY294LnN1bSRjb2VmZmljaWVudHNbMSwxXQogICAgY294LlNFID0gY294LnN1bSRjb2VmZmljaWVudHNbMSwzXQogICAgY294LkhSZWZmZWN0ID0gY294LnN1bSRjb2VmZmljaWVudHNbMSwyXQogICAgY294LkNJX2xvdyA9IGV4cChjb3guZWZmZWN0c2l6ZSAtIDEuOTYgKiBjb3guU0UpCiAgICBjb3guQ0lfdXAgPSBleHAoY294LmVmZmVjdHNpemUgKyAxLjk2ICogY294LlNFKQogICAgY294Lnp2YWx1ZSA9IGNveC5zdW0kY29lZmZpY2llbnRzWzEsNF0KICAgIGNveC5wdmFsdWUgPSBjb3guc3VtJGNvZWZmaWNpZW50c1sxLDVdCiAgICBjb3guc2FtcGxlX3NpemUgPSBjb3guc3VtJG4KICAgIGNveC5uZXZlbnRzID0gY294LnN1bSRuZXZlbnQKICAgIAogICAgb3V0cHV0ID0gYyhEQVRBU0VULCBPVVRDT01FLCBwcm90ZWluLCBjb3guZWZmZWN0c2l6ZSwgY294LlNFLCBjb3guSFJlZmZlY3QsIGNveC5DSV9sb3csIGNveC5DSV91cCwgY294Lnp2YWx1ZSwgY294LnB2YWx1ZSwgY294LnNhbXBsZV9zaXplLCBjb3gubmV2ZW50cykKICAgIGNhdCgiV2UgaGF2ZSBjb2xsZWN0ZWQgdGhlIGZvbGxvd2luZzpcbiIpCiAgICBjYXQoIkRhdGFzZXQgdXNlZC4uLi4uLi4uLi4uLi4uOiIsIERBVEFTRVQsICJcbiIpCiAgICBjYXQoIk91dGNvbWUgYW5hbHl6ZWQuLi4uLi4uLi4uOiIsIE9VVENPTUUsICJcbiIpCiAgICBjYXQoIlByb3RlaW4uLi4uLi4uLi4uLi4uLi4uLi4uOiIsIHByb3RlaW4sICJcbiIpCiAgICBjYXQoIkVmZmVjdCBzaXplLi4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKGNveC5lZmZlY3RzaXplLCA2KSwgIlxuIikKICAgIGNhdCgiU3RhbmRhcmQgZXJyb3IuLi4uLi4uLi4uLi46Iiwgcm91bmQoY294LlNFLCA2KSwgIlxuIikKICAgIGNhdCgiT2RkcyByYXRpbyAoZWZmZWN0IHNpemUpLi46Iiwgcm91bmQoY294LkhSZWZmZWN0LCAzKSwgIlxuIikKICAgIGNhdCgiTG93ZXIgOTUlIENJLi4uLi4uLi4uLi4uLi46Iiwgcm91bmQoY294LkNJX2xvdywgMyksICJcbiIpCiAgICBjYXQoIlVwcGVyIDk1JSBDSS4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKGNveC5DSV91cCwgMyksICJcbiIpCiAgICBjYXQoIlQtdmFsdWUuLi4uLi4uLi4uLi4uLi4uLi4uOiIsIHJvdW5kKGNveC56dmFsdWUsIDYpLCAiXG4iKQogICAgY2F0KCJQLXZhbHVlLi4uLi4uLi4uLi4uLi4uLi4uLjoiLCBzaWduaWYoY294LnB2YWx1ZSwgOCksICJcbiIpCiAgICBjYXQoIlNhbXBsZSBzaXplIGluIG1vZGVsLi4uLi4uOiIsIGNveC5zYW1wbGVfc2l6ZSwgIlxuIikKICAgIGNhdCgiTnVtYmVyIG9mIGV2ZW50cy4uLi4uLi4uLi46IiwgY294Lm5ldmVudHMsICJcbiIpCiAgfQogIHJldHVybihvdXRwdXQpCiAgcHJpbnQob3V0cHV0KQp9IAoKdGltZXMgPSBjKCJlcF9tYWpvcl90XzN5ZWFycyIsIAogICAgICAgICAgImVwX3N0cm9rZV90XzN5ZWFycyIsICJlcF9jb3JvbmFyeV90XzN5ZWFycyIsICJlcF9jdmRlYXRoX3RfM3llYXJzIikKCmVuZHBvaW50cyA9IGMoImVwbWFqb3IuM3llYXJzIiwgCiAgICAgICAgICAgICAgImVwc3Ryb2tlLjN5ZWFycyIsICJlcGNvcm9uYXJ5LjN5ZWFycyIsICJlcGN2ZGVhdGguM3llYXJzIikKCmNhdCgiKiBDaGVjayB0aGUgY2FzZXMgcGVyIGV2ZW50IHR5cGUgLSBmb3Igc2FuaXR5LiIpCmZvciAoZXZlbnRzIGluIGVuZHBvaW50cyl7CiAgcmVxdWlyZShsYWJlbGxlZCkKICBwcmludChwYXN0ZTAoIlByaW50aW5nIHRoZSBzdW1tYXJ5IG9mOiAiLGV2ZW50cykpCiAgIyBwcmludChzdW1tYXJ5KEFFREIuQ0VBWyxldmVudHNdKSkKICBwcmludCh0YWJsZShBRURCLkNFQVssZXZlbnRzXSkpCn0KCmNhdCgiKiBDaGVjayBkaXN0cmlidXRpb24gb2YgZXZlbnRzIG92ZXIgdGltZSAtIGZvciBzYW5pdHkuIikKZm9yIChldmVudHRpbWVzIGluIHRpbWVzKXsKICBwcmludChwYXN0ZTAoIlByaW50aW5nIHRoZSBzdW1tYXJ5IG9mOiAiLGV2ZW50dGltZXMpKQogIHByaW50KHN1bW1hcnkoQUVEQi5DRUFbLGV2ZW50dGltZXNdKSkKfQoKZm9yIChldmVudHRpbWUgaW4gdGltZXMpewogIAogIHByaW50KHBhc3RlMCgiUHJpbnRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZjogIixldmVudHRpbWUpKQogIHAgPC0gZ2doaXN0b2dyYW0oQUVEQi5DRUEsIHggPSBldmVudHRpbWUsIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICBtYWluID0gZXZlbnR0aW1lLCBiaW5zID0gMTUsIAogICAgICAgICAgICAgIHhsYWIgPSAieWVhciIsIGNvbG9yID0gdWl0aG9mX2NvbG9yWzE2XSwgZmlsbCA9IHVpdGhvZl9jb2xvclsxNl0sIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpIAogcHJpbnQocCkKIGdnc2F2ZShmaWxlID0gcGFzdGUwKFFDX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuRXZlbnREaXN0cmlidXRpb25QZXJZZWFyLiIsZXZlbnR0aW1lLCIucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKfQoKdGltZXMzMCA9IGMoImVwX21ham9yX3RfMzBkYXlzIiwgCiAgICAgICAgICAiZXBfc3Ryb2tlX3RfMzBkYXlzIiwgImVwX2Nvcm9uYXJ5X3RfMzBkYXlzIiwgImVwX2N2ZGVhdGhfdF8zMGRheXMiKQoKZW5kcG9pbnRzMzAgPSBjKCJlcG1ham9yLjMwZGF5cyIsIAogICAgICAgICAgICAgICJlcHN0cm9rZS4zMGRheXMiLCAiZXBjb3JvbmFyeS4zMGRheXMiLCAiZXBjdmRlYXRoLjMwZGF5cyIpCgpjYXQoIiogQ2hlY2sgdGhlIGNhc2VzIHBlciBldmVudCB0eXBlIC0gZm9yIHNhbml0eS4iKQpmb3IgKGV2ZW50cyBpbiBlbmRwb2ludHMzMCl7CiAgcHJpbnQocGFzdGUwKCJQcmludGluZyB0aGUgc3VtbWFyeSBvZjogIixldmVudHMpKQogICMgcHJpbnQoc3VtbWFyeShBRURCLkNFQVssZXZlbnRzXSkpCiAgcHJpbnQodGFibGUoQUVEQi5DRUFbLGV2ZW50c10pKQp9CgpjYXQoIiogQ2hlY2sgZGlzdHJpYnV0aW9uIG9mIGV2ZW50cyBvdmVyIHRpbWUgLSBmb3Igc2FuaXR5LiIpCmZvciAoZXZlbnR0aW1lcyBpbiB0aW1lczMwKXsKICBwcmludChwYXN0ZTAoIlByaW50aW5nIHRoZSBzdW1tYXJ5IG9mOiAiLGV2ZW50dGltZXMpKQogIHByaW50KHN1bW1hcnkoQUVEQi5DRUFbLGV2ZW50dGltZXNdKSkKfQoKZm9yIChldmVudHRpbWUgaW4gdGltZXMzMCl7CiAgCiAgcHJpbnQocGFzdGUwKCJQcmludGluZyB0aGUgZGlzdHJpYnV0aW9uIG9mOiAiLGV2ZW50dGltZSkpCiAgcCA8LSBnZ2hpc3RvZ3JhbShBRURCLkNFQSwgeCA9IGV2ZW50dGltZSwgeSA9ICIuLmNvdW50Li4iLAogICAgICAgICAgICAgIG1haW4gPSBldmVudHRpbWUsIGJpbnMgPSAxNSwgCiAgICAgICAgICAgICAgeGxhYiA9ICJkYXlzIiwgY29sb3IgPSB1aXRob2ZfY29sb3JbMTZdLCBmaWxsID0gdWl0aG9mX2NvbG9yWzE2XSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkgCiBwcmludChwKQogZ2dzYXZlKGZpbGUgPSBwYXN0ZTAoUUNfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5FdmVudERpc3RyaWJ1dGlvblBlcjMwRGF5cy4iLGV2ZW50dGltZSwiLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCn0KCnRpbWVzOTAgPSBjKCJlcF9tYWpvcl90XzkwZGF5cyIsIAogICAgICAgICAgImVwX3N0cm9rZV90XzkwZGF5cyIsICJlcF9jb3JvbmFyeV90XzkwZGF5cyIsICJlcF9jdmRlYXRoX3RfOTBkYXlzIikKCmVuZHBvaW50czkwID0gYygiZXBtYWpvci45MGRheXMiLCAKICAgICAgICAgICAgICAiZXBzdHJva2UuOTBkYXlzIiwgImVwY29yb25hcnkuOTBkYXlzIiwgImVwY3ZkZWF0aC45MGRheXMiKQoKY2F0KCIqIENoZWNrIHRoZSBjYXNlcyBwZXIgZXZlbnQgdHlwZSAtIGZvciBzYW5pdHkuIikKZm9yIChldmVudHMgaW4gZW5kcG9pbnRzOTApewogIHByaW50KHBhc3RlMCgiUHJpbnRpbmcgdGhlIHN1bW1hcnkgb2Y6ICIsZXZlbnRzKSkKICAjIHByaW50KHN1bW1hcnkoQUVEQi5DRUFbLGV2ZW50c10pKQogIHByaW50KHRhYmxlKEFFREIuQ0VBWyxldmVudHNdKSkKfQoKY2F0KCIqIENoZWNrIGRpc3RyaWJ1dGlvbiBvZiBldmVudHMgb3ZlciB0aW1lIC0gZm9yIHNhbml0eS4iKQpmb3IgKGV2ZW50dGltZXMgaW4gdGltZXM5MCl7CiAgcHJpbnQocGFzdGUwKCJQcmludGluZyB0aGUgc3VtbWFyeSBvZjogIixldmVudHRpbWVzKSkKICBwcmludChzdW1tYXJ5KEFFREIuQ0VBWyxldmVudHRpbWVzXSkpCn0KCmZvciAoZXZlbnR0aW1lIGluIHRpbWVzOTApewogIAogIHByaW50KHBhc3RlMCgiUHJpbnRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZjogIixldmVudHRpbWUpKQogIHAgPC0gZ2doaXN0b2dyYW0oQUVEQi5DRUEsIHggPSBldmVudHRpbWUsIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICBtYWluID0gZXZlbnR0aW1lLCBiaW5zID0gMTUsIAogICAgICAgICAgICAgIHhsYWIgPSAiZGF5cyIsIGNvbG9yID0gdWl0aG9mX2NvbG9yWzE2XSwgZmlsbCA9IHVpdGhvZl9jb2xvclsxNl0sIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpIAogcHJpbnQocCkKIGdnc2F2ZShmaWxlID0gcGFzdGUwKFFDX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuRXZlbnREaXN0cmlidXRpb25QZXI5MERheXMuIixldmVudHRpbWUsIi5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQp9CgoKYGBgCgoKIyMjIENveCByZWdyZXNzaW9ucwoKTGV0J3MgcGVyZm9ybSB0aGUgYWN0dWFsIENveC1yZWdyZXNzaW9ucy4gV2Ugd2lsbCBhcHBseSBhIGNvdXBsZSBvZiBtb2RlbHM6IAoKLSBNb2RlbCAxOiBhZGp1c3RlZCBmb3IgYWdlLCBzZXgsIGFuZCB5ZWFyIG9mIHN1cmdlcnkKLSBNb2RlbCAyOiBhZGp1c3RlZCBmb3IgYWdlLCBzZXgsIHllYXIgb2Ygc3VyZ2VyeSwgaHlwZXJ0ZW5zaW9uLCBkaWFiZXRlcywgc21va2luZywgTERMLUMgbGV2ZWxzLCBsaXBpZC1sb3dlcmluZyBkcnVncywgYW50aXBsYXRlbGV0IGRydWdzLCBlR0ZSLCBCTUksIGhpc3Rvcnkgb2YgQ1ZELCBsZXZlbCBvZiBzdGVub3NpcwoKIyMjIyAzIHllYXJzIGZvbGxvdy11cAoKKk1PREVMIDEqCmBgYHtyIENveC1yZWdyZXNzaW9uIEFuYWx5c2lzOiBTaW1wbGUgbW9kZWx9CiMgU2V0IHVwIGEgZGF0YWZyYW1lIHRvIHJlY2VpdmUgcmVzdWx0cwpDT1gucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDEyLCBucm93ID0gMCkpCgojIExvb3Bpbmcgb3ZlciBlYWNoIHByb3RlaW4vZW5kcG9pbnQvdGltZSBjb21iaW5hdGlvbgpmb3IgKGkgaW4gMTpsZW5ndGgodGltZXMpKXsKICBlcHRpbWUgPSB0aW1lc1tpXQogIGVwID0gZW5kcG9pbnRzW2ldCiAgY2F0KHBhc3RlMCgiKiBBbmFseXppbmcgdGhlIGVmZmVjdCBvZiBwbGFxdWUgcHJvdGVpbnMgb24gWyIsZXAsIl0uXG4iKSkKICBjYXQoIiAtIGNyZWF0aW5nIHRlbXBvcmFyeSBTRSBmb3IgdGhpcyB3b3JrLlxuIikKICBURU1QLkRGID0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSkKICBjYXQoIiAtIG1ha2luZyBhICdTdXJ2JyBvYmplY3QgYW5kIGFkZGluZyB0aGlzIHRvIHRlbXBvcmFyeSBkYXRhZnJhbWUuXG4iKQogIFRFTVAuREYkZXZlbnQgPC0gYXMuaW50ZWdlcihURU1QLkRGWyxlcF0pCiAgVEVNUC5ERiR5IDwtIFN1cnYodGltZSA9IFRFTVAuREZbLGVwdGltZV0sIGV2ZW50ID0gVEVNUC5ERiRldmVudCkKICBjYXQoIiAtIG1ha2luZyBzdHJhdGEgb2YgZWFjaCBvZiB0aGUgcGxhcXVlIHByb3RlaW5zIGFuZCBzdGFydCBzdXJ2aXZhbCBhbmFseXNpcy5cbiIpCiAgCiAgZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspKXsKICAgIGNhdChwYXN0ZTAoIiAgID4gcHJvY2Vzc2luZyBbIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCJdOyAiLHByb3RlaW4sIiBvdXQgb2YgIixsZW5ndGgoVFJBSVRTLlBST1RFSU4uUkFOSyksIiBwcm90ZWlucy5cbiIpKQogICAgIyBzcGxpdHRpbmcgaW50byB0d28gZ3JvdXBzCiAgICBURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSA8LSBjdXQyKFRFTVAuREZbLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl1dLCBnID0gMikKICAgIGNhdChwYXN0ZTAoIiAgID4gY3Jvc3MgdGFidWxhdGlvbiBvZiAiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi1zdHJhdHVtLlxuIikpCiAgICBzaG93KHRhYmxlKFRFTVAuREZbWyBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dIF1dKSkKICAgIAogICAgY2F0KHBhc3RlMCgiXG4gICA+IGZpdHRpbmcgdGhlIG1vZGVsIGZvciAiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi1zdHJhdHVtLlxuIikpCiAgICBmaXQgPC0gc3VydmZpdChhcy5mb3JtdWxhKHBhc3RlMCgieSB+ICIsIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0pKSwgZGF0YSA9IFRFTVAuREYpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBtYWtlIGEgS2FwbGFuLU1laWVyLXNoaXp6bGUuLi5cbiIpKQogICAgIyBtYWtlIEthcGxhbi1NZWllciBjdXJ2ZSBhbmQgc2F2ZSBpdAogICAgc2hvdyhnZ3N1cnZwbG90KGZpdCwgZGF0YSA9IFRFTVAuREYsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgICMgcGFsZXRlID0gYygiRjU5RDEwIiwgIiNEQjAwM0YiLCAiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBjKDEsMiksCiAgICAgICAgICAgICAgICAgICAgIyBsaW5ldHlwZSA9IGMoMSwyLDMsNCksCiAgICAgICAgICAgICAgICAgICAgIyBjb25mLmludCA9IEZBTFNFLCBjb25mLmludC5maWxsID0gIiM1OTVBNUMiLCBjb25mLmludC5hbHBoYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICBwdmFsID0gRkFMU0UsIHB2YWwubWV0aG9kID0gRkFMU0UsIHB2YWwuc2l6ZSA9IDQsCiAgICAgICAgICAgICAgICAgICAgcmlzay50YWJsZSA9IFRSVUUsIHJpc2sudGFibGUueS50ZXh0ID0gRkFMU0UsIHRhYmxlcy55LnRleHQuY29sID0gVFJVRSwgZm9udHNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIGNlbnNvciA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gcGFzdGUwKCIiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIiIpLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5sYWJzID0gYygibG93IiwgImhpZ2giKSwKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHBhc3RlMCgiUmlzayBvZiAiLGVwLCIiKSwgeGxhYiA9ICJUaW1lIFt5ZWFyc10iLCBmb250Lm1haW4gPSBjKDE2LCAiYm9sZCIsICJibGFjayIpKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5zdXJ2aXZhbC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi5wZGYiKSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTAsIG9uZWZpbGUgPSBGQUxTRSkKCiAgICBjYXQocGFzdGUwKCJcbiAgID4gcGVyZm9ybSB0aGUgQ294LXJlZ3Jlc3Npb24gZmFzaGl6emxlIGFuZCBwbG90IGl0Li4uXG4iKSkKICAgICMjIyBEbyBDb3gtcmVncmVzc2lvbiBhbmQgcGxvdCBpdAogICAgCiAgICAjIyMgTU9ERUwgMSAoU2ltcGxlIG1vZGVsKQogICAgY294ID0gY294cGgoU3VydihURU1QLkRGWyxlcHRpbWVdLCBldmVudCkgfiBURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXStBZ2UrR2VuZGVyICsgT1JkYXRlX3llYXIsIGRhdGEgPSBURU1QLkRGKQogICAgY294cGxvdCA9IGNveHBoKFN1cnYoVEVNUC5ERlssZXB0aW1lXSwgZXZlbnQpIH4gc3RyYXRhKFRFTVAuREZbWyBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dIF1dKStBZ2UrR2VuZGVyICsgT1JkYXRlX3llYXIsIGRhdGEgPSBURU1QLkRGKQoKICAgIHBsb3Qoc3VydmZpdChjb3hwbG90KSwgbWFpbiA9IHBhc3RlMCgiQ294IHByb3BvcnRpb25hbCBoYXphcmQgb2YgWyIsZXAsIl0gcGVyIFsiLGVwdGltZSwiXS4iKSwKICAgICAgICAgIyB5bGltID0gYygwLjIsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjNTk1QTVDIiwgIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICB5bGltID0gYygwLCAxKSwgeGxpbSA9IGMoMCwzKSwgY29sID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgIGx0eSA9IGMoMSwyKSwgbHdkID0gMiwKICAgICAgICAgeWxhYiA9ICJTdXZpdmFsIHByb2JhYmlsaXR5IiwgeGxhYiA9ICJGVSB0aW1lIFt5ZWFyc10iLAogICAgICAgICBtYXJrLnRpbWUgPSBGQUxTRSwgYXhlcyA9IEZBTFNFLCBidHkgPSAibiIpCiAgICBsZWdlbmQoInRvcHJpZ2h0IiwKICAgICAgICAgICBjKCJsb3ciLCAiaGlnaCIpLAogICAgICAgICAgIHRpdGxlID0gcGFzdGUwKCIiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIiIpLAogICAgICAgICAgIGNvbCA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAgIGx0eSA9IGMoMSwyKSwgbHdkID0gMiwKICAgICAgICAgICBidHkgPSAibiIpCiAgICBheGlzKHNpZGUgPSAxLCBhdCA9IHNlcSgwLCAzLCBieSA9IDEpKQogICAgYXhpcyhzaWRlID0gMiwgYXQgPSBzZXEoMCwgMSwgYnkgPSAwLjIpKQogICAgZGV2LmNvcHkycGRmKGZpbGUgPSBwYXN0ZTAoQ09YX2xvYywiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2RheSwiLkFFREIuQ0VBLkNveC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kYXksIi5BRURCLkNFQS5Db3guIixlcCwiLjRHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIuTU9ERUwxLnBkZiIpLCBoZWlnaHQgPSAxMiwgd2lkdGggPSAxMCwgb25lZmlsZSA9IFRSVUUpCiAgICBzaG93KHN1bW1hcnkoY294KSkKCiAgICBjYXQocGFzdGUwKCJcbiAgID4gd3JpdGluZyB0aGUgQ294LXJlZ3Jlc3Npb24gZmFzaGl6emxlIHRvIEV4Y2VsLi4uXG4iKSkKCiAgICBDT1gucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTIsIG5yb3cgPSAwKSkKICAgIENPWC5yZXN1bHRzLlRFTVBbMSxdID0gQ09YLlNUQVQoY294LCAiQUVEQi5DRUEiLCBlcCwgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSkKICAgIENPWC5yZXN1bHRzID0gcmJpbmQoQ09YLnJlc3VsdHMsIENPWC5yZXN1bHRzLlRFTVApCgogIH0KfQoKY2F0KCItIEVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoQ09YLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJPdXRjb21lIiwgIkNwRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJldGEiLCAicy5lLm0uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiSFIiLCAibG93OTVDSSIsICJ1cDk1Q0kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJaLXZhbHVlIiwgIlAtdmFsdWUiLCAiU2FtcGxlU2l6ZSIsICJOX2V2ZW50cyIpCgpjYXQoIi0gQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkNPWC5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRCZXRhKQpDT1gucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRzLmUubS4pCkNPWC5yZXN1bHRzJEhSIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkSFIpCkNPWC5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRsb3c5NUNJKQpDT1gucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyR1cDk1Q0kpCkNPWC5yZXN1bHRzJGBaLXZhbHVlYCA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGBaLXZhbHVlYCkKQ09YLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFAtdmFsdWVgKQpDT1gucmVzdWx0cyRTYW1wbGVTaXplIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkU2FtcGxlU2l6ZSkKQ09YLnJlc3VsdHMkTl9ldmVudHMgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyROX2V2ZW50cykKCkFFREIuQ0VBLkNPWC5yZXN1bHRzIDwtIENPWC5yZXN1bHRzCgojIFNhdmUgdGhlIGRhdGEKY2F0KCItIFdyaXRpbmcgcmVzdWx0cyB0byBFeGNlbC1maWxlLi4uXG4iKQpoZWFkLnN0eWxlIDwtIGNyZWF0ZVN0eWxlKHRleHREZWNvcmF0aW9uID0gIkJPTEQiKQp3cml0ZS54bHN4KEFFREIuQ0VBLkNPWC5yZXN1bHRzLAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuQ294LjJHLk1PREVMMS54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQojcm0oVEVNUC5ERiwgcHJvdGVpbiwgZml0LCBjb3gsIGNveHBsb3QsIENPWC5yZXN1bHRzLCBDT1gucmVzdWx0cy5URU1QLCBoZWFkLnN0eWxlLCBBRURCLkNFQS5DT1gucmVzdWx0cykKCiNybShoZWFkLnN0eWxlKQoKYGBgCgoqTU9ERUwgMioKYGBge3IgQ294LXJlZ3Jlc3Npb24gQW5hbHlzaXM6IE1PREVMIDJ9CiMgU2V0IHVwIGEgZGF0YWZyYW1lIHRvIHJlY2VpdmUgcmVzdWx0cwpDT1gucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDEyLCBucm93ID0gMCkpCgojIExvb3Bpbmcgb3ZlciBlYWNoIHByb3RlaW4vZW5kcG9pbnQvdGltZSBjb21iaW5hdGlvbgpmb3IgKGkgaW4gMTpsZW5ndGgodGltZXMpKXsKICBlcHRpbWUgPSB0aW1lc1tpXQogIGVwID0gZW5kcG9pbnRzW2ldCiAgY2F0KHBhc3RlMCgiKiBBbmFseXppbmcgdGhlIGVmZmVjdCBvZiBwbGFxdWUgcHJvdGVpbnMgb24gWyIsZXAsIl0uXG4iKSkKICBjYXQoIiAtIGNyZWF0aW5nIHRlbXBvcmFyeSBTRSBmb3IgdGhpcyB3b3JrLlxuIikKICBURU1QLkRGID0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSkKICBjYXQoIiAtIG1ha2luZyBhICdTdXJ2JyBvYmplY3QgYW5kIGFkZGluZyB0aGlzIHRvIHRlbXBvcmFyeSBkYXRhZnJhbWUuXG4iKQogIFRFTVAuREYkZXZlbnQgPC0gYXMuaW50ZWdlcihURU1QLkRGWyxlcF0pCiAgI2FzLmludGVnZXIoVEVNUC5ERlssZXBdID09ICJFeGNsdWRlZCIpCgogIFRFTVAuREYkeSA8LSBTdXJ2KHRpbWUgPSBURU1QLkRGWyxlcHRpbWVdLCBldmVudCA9IFRFTVAuREYkZXZlbnQpCiAgY2F0KCIgLSBtYWtpbmcgc3RyYXRhIG9mIGVhY2ggb2YgdGhlIHBsYXF1ZSBwcm90ZWlucyBhbmQgc3RhcnQgc3Vydml2YWwgYW5hbHlzaXMuXG4iKQogIAogIGZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSl7CiAgICBjYXQocGFzdGUwKCIgICA+IHByb2Nlc3NpbmcgWyIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiXTsgIixwcm90ZWluLCIgb3V0IG9mICIsbGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspLCIgcHJvdGVpbnMuXG4iKSkKICAgICMgc3BsaXR0aW5nIGludG8gdHdvIGdyb3VwcwogICAgVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0gPC0gY3V0MihURU1QLkRGWyxUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dXSwgZyA9IDIpCiAgICBjYXQocGFzdGUwKCIgICA+IGNyb3NzIHRhYnVsYXRpb24gb2YgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgc2hvdyh0YWJsZShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBmaXR0aW5nIHRoZSBtb2RlbCBmb3IgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgZml0IDwtIHN1cnZmaXQoYXMuZm9ybXVsYShwYXN0ZTAoInkgfiAiLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKSksIGRhdGEgPSBURU1QLkRGKQogICAgCiAgICBjYXQocGFzdGUwKCJcbiAgID4gbWFrZSBhIEthcGxhbi1NZWllci1zaGl6emxlLi4uXG4iKSkKICAgICMgbWFrZSBLYXBsYW4tTWVpZXIgY3VydmUgYW5kIHNhdmUgaXQKICAgIHNob3coZ2dzdXJ2cGxvdChmaXQsIGRhdGEgPSBURU1QLkRGLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICAjIHBhbGV0ZSA9IGMoIkY1OUQxMCIsICIjREIwMDNGIiwgIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYygxLDIpLAogICAgICAgICAgICAgICAgICAgICMgbGluZXR5cGUgPSBjKDEsMiwzLDQpLAogICAgICAgICAgICAgICAgICAgICMgY29uZi5pbnQgPSBGQUxTRSwgY29uZi5pbnQuZmlsbCA9ICIjNTk1QTVDIiwgY29uZi5pbnQuYWxwaGEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgcHZhbCA9IEZBTFNFLCBwdmFsLm1ldGhvZCA9IEZBTFNFLCBwdmFsLnNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIHJpc2sudGFibGUgPSBUUlVFLCByaXNrLnRhYmxlLnkudGV4dCA9IEZBTFNFLCB0YWJsZXMueS50ZXh0LmNvbCA9IFRSVUUsIGZvbnRzaXplID0gNCwKICAgICAgICAgICAgICAgICAgICBjZW5zb3IgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIlJpc2sgb2YgIixlcCwiIiksIHhsYWIgPSAiVGltZSBbeWVhcnNdIiwgZm9udC5tYWluID0gYygxNiwgImJvbGQiLCAiYmxhY2siKSkpCiAgICBkZXYuY29weTJwZGYoZmlsZSA9IHBhc3RlMChDT1hfbG9jLCIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5LCIuQUVEQi5DRUEuc3Vydml2YWwuIixlcCwiLjJHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBvbmVmaWxlID0gRkFMU0UpCgogICAgY2F0KHBhc3RlMCgiXG4gICA+IHBlcmZvcm0gdGhlIENveC1yZWdyZXNzaW9uIGZhc2hpenpsZSBhbmQgcGxvdCBpdC4uLlxuIikpCiAgICAjIyMgRG8gQ294LXJlZ3Jlc3Npb24gYW5kIHBsb3QgaXQKICAgIAogICAgIyMjIE1PREVMIDIgYWRqdXN0ZWQgZm9yIGFnZSwgc2V4LCBoeXBlcnRlbnNpb24sIGRpYWJldGVzLCBzbW9raW5nLCBMREwtQyBsZXZlbHMsIGxpcGlkLWxvd2VyaW5nIGRydWdzLCBhbnRpcGxhdGVsZXQgZHJ1Z3MsIGVHRlIsIEJNSSwgaGlzdG9yeSBvZiBDVkQsIGxldmVsIG9mIHN0ZW5vc2lzCiAgICBjb3ggPSBjb3hwaChTdXJ2KFRFTVAuREZbLGVwdGltZV0sIGV2ZW50KSB+IFRFTVAuREZbWyBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dIF1dK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCiAgICBjb3hwbG90ID0gY294cGgoU3VydihURU1QLkRGWyxlcHRpbWVdLCBldmVudCkgfiBzdHJhdGEoVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0pK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCgogIAogICAgcGxvdChzdXJ2Zml0KGNveHBsb3QpLCBtYWluID0gcGFzdGUwKCJDb3ggcHJvcG9ydGlvbmFsIGhhemFyZCBvZiBbIixlcCwiXSBwZXIgWyIsZXB0aW1lLCJdLiIpLAogICAgICAgICAjIHlsaW0gPSBjKDAuMiwgMSksIHhsaW0gPSBjKDAsMyksIGNvbCA9IGMoIiM1OTVBNUMiLCAiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgIHlsaW0gPSBjKDAsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgbHR5ID0gYygxLDIpLCBsd2QgPSAyLAogICAgICAgICB5bGFiID0gIlN1dml2YWwgcHJvYmFiaWxpdHkiLCB4bGFiID0gIkZVIHRpbWUgW3llYXJzXSIsCiAgICAgICAgIG1hcmsudGltZSA9IEZBTFNFLCBheGVzID0gRkFMU0UsIGJ0eSA9ICJuIikKICAgIGxlZ2VuZCgidG9wcmlnaHQiLAogICAgICAgICAgIGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIiIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiIiksCiAgICAgICAgICAgY29sID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgbHR5ID0gYygxLDIpLCBsd2QgPSAyLAogICAgICAgICAgIGJ0eSA9ICJuIikKICAgIGF4aXMoc2lkZSA9IDEsIGF0ID0gc2VxKDAsIDMsIGJ5ID0gMSkpCiAgICBheGlzKHNpZGUgPSAyLCBhdCA9IHNlcSgwLCAxLCBieSA9IDAuMikpCiAgICBkZXYuY29weTJwZGYoZmlsZSA9IHBhc3RlMChDT1hfbG9jLCIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5LCIuQUVEQi5DRUEuQ294LiIsZXAsIi4yRy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb2RheSwiLkFFREIuQ0VBLkNveC4iLGVwLCIuNEcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi5NT0RFTDIucGRmIiksIGhlaWdodCA9IDEyLCB3aWR0aCA9IDEwLCBvbmVmaWxlID0gVFJVRSkKCiAgICBzaG93KHN1bW1hcnkoY294KSkKCiAgICBjYXQocGFzdGUwKCJcbiAgID4gd3JpdGluZyB0aGUgQ294LXJlZ3Jlc3Npb24gZmFzaGl6emxlIHRvIEV4Y2VsLi4uXG4iKSkKCiAgICBDT1gucmVzdWx0cy5URU1QIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBuY29sID0gMTIsIG5yb3cgPSAwKSkKICAgIENPWC5yZXN1bHRzLlRFTVBbMSxdID0gQ09YLlNUQVQoY294LCAiQUVEQi5DRUEiLCBlcCwgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSkKICAgIENPWC5yZXN1bHRzID0gcmJpbmQoQ09YLnJlc3VsdHMsIENPWC5yZXN1bHRzLlRFTVApCgogIH0KfQoKY2F0KCItIEVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoQ09YLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJPdXRjb21lIiwgIkNwRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJldGEiLCAicy5lLm0uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiSFIiLCAibG93OTVDSSIsICJ1cDk1Q0kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJaLXZhbHVlIiwgIlAtdmFsdWUiLCAiU2FtcGxlU2l6ZSIsICJOX2V2ZW50cyIpCgpjYXQoIi0gQ29ycmVjdCB0aGUgdmFyaWFibGUgdHlwZXMuLi5cbiIpCkNPWC5yZXN1bHRzJEJldGEgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRCZXRhKQpDT1gucmVzdWx0cyRzLmUubS4gPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRzLmUubS4pCkNPWC5yZXN1bHRzJEhSIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkSFIpCkNPWC5yZXN1bHRzJGxvdzk1Q0kgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRsb3c5NUNJKQpDT1gucmVzdWx0cyR1cDk1Q0kgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyR1cDk1Q0kpCkNPWC5yZXN1bHRzJGBaLXZhbHVlYCA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGBaLXZhbHVlYCkKQ09YLnJlc3VsdHMkYFAtdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFAtdmFsdWVgKQpDT1gucmVzdWx0cyRTYW1wbGVTaXplIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkU2FtcGxlU2l6ZSkKQ09YLnJlc3VsdHMkTl9ldmVudHMgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyROX2V2ZW50cykKCkFFREIuQ0VBLkNPWC5yZXN1bHRzIDwtIENPWC5yZXN1bHRzCgojIFNhdmUgdGhlIGRhdGEKY2F0KCItIFdyaXRpbmcgcmVzdWx0cyB0byBFeGNlbC1maWxlLi4uXG4iKQpoZWFkLnN0eWxlIDwtIGNyZWF0ZVN0eWxlKHRleHREZWNvcmF0aW9uID0gIkJPTEQiKQp3cml0ZS54bHN4KEFFREIuQ0VBLkNPWC5yZXN1bHRzLAogICAgICAgICAgIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuQUVEQi5DRUEuQ294LjJHLk1PREVMMi54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQpybShURU1QLkRGLCBwcm90ZWluLCBmaXQsIGNveCwgY294cGxvdCwgQ09YLnJlc3VsdHMsIENPWC5yZXN1bHRzLlRFTVAsIGhlYWQuc3R5bGUsIEFFREIuQ0VBLkNPWC5yZXN1bHRzKQoKcm0oaGVhZC5zdHlsZSkKCmBgYAoKCiMjIyMgMzAtZGF5cyBmb2xsb3ctdXAKCipNT0RFTCAxKgpgYGB7ciBDb3gtcmVncmVzc2lvbiBBbmFseXNpczogU2ltcGxlIG1vZGVsLCAzMCBkYXlzfQojIFNldCB1cCBhIGRhdGFmcmFtZSB0byByZWNlaXZlIHJlc3VsdHMKQ09YLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQoKIyBMb29waW5nIG92ZXIgZWFjaCBwcm90ZWluL2VuZHBvaW50L3RpbWUgY29tYmluYXRpb24KZm9yIChpIGluIDE6bGVuZ3RoKHRpbWVzMzApKXsKICBlcHRpbWUgPSB0aW1lczMwW2ldCiAgZXAgPSBlbmRwb2ludHMzMFtpXQogIGNhdChwYXN0ZTAoIiogQW5hbHl6aW5nIHRoZSBlZmZlY3Qgb2YgcGxhcXVlIHByb3RlaW5zIG9uIFsiLGVwLCJdLlxuIikpCiAgY2F0KCIgLSBjcmVhdGluZyB0ZW1wb3JhcnkgU0UgZm9yIHRoaXMgd29yay5cbiIpCiAgVEVNUC5ERiA9IGFzLmRhdGEuZnJhbWUoQUVEQi5DRUEpCiAgY2F0KCIgLSBtYWtpbmcgYSAnU3Vydicgb2JqZWN0IGFuZCBhZGRpbmcgdGhpcyB0byB0ZW1wb3JhcnkgZGF0YWZyYW1lLlxuIikKICBURU1QLkRGJGV2ZW50IDwtIGFzLmludGVnZXIoVEVNUC5ERlssZXBdKQogIFRFTVAuREYkeSA8LSBTdXJ2KHRpbWUgPSBURU1QLkRGWyxlcHRpbWVdLCBldmVudCA9IFRFTVAuREYkZXZlbnQpCiAgY2F0KCIgLSBtYWtpbmcgc3RyYXRhIG9mIGVhY2ggb2YgdGhlIHBsYXF1ZSBwcm90ZWlucyBhbmQgc3RhcnQgc3Vydml2YWwgYW5hbHlzaXMuXG4iKQogIAogIGZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSl7CiAgICBjYXQocGFzdGUwKCIgICA+IHByb2Nlc3NpbmcgWyIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiXTsgIixwcm90ZWluLCIgb3V0IG9mICIsbGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspLCIgcHJvdGVpbnMuXG4iKSkKICAgICMgc3BsaXR0aW5nIGludG8gdHdvIGdyb3VwcwogICAgVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0gPC0gY3V0MihURU1QLkRGWyxUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dXSwgZyA9IDIpCiAgICBjYXQocGFzdGUwKCIgICA+IGNyb3NzIHRhYnVsYXRpb24gb2YgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgc2hvdyh0YWJsZShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBmaXR0aW5nIHRoZSBtb2RlbCBmb3IgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgZml0IDwtIHN1cnZmaXQoYXMuZm9ybXVsYShwYXN0ZTAoInkgfiAiLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKSksIGRhdGEgPSBURU1QLkRGKQogICAgCiAgICBjYXQocGFzdGUwKCJcbiAgID4gbWFrZSBhIEthcGxhbi1NZWllci1zaGl6emxlLi4uXG4iKSkKICAgICMgbWFrZSBLYXBsYW4tTWVpZXIgY3VydmUgYW5kIHNhdmUgaXQKICAgIHNob3coZ2dzdXJ2cGxvdChmaXQsIGRhdGEgPSBURU1QLkRGLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICAjIHBhbGV0ZSA9IGMoIkY1OUQxMCIsICIjREIwMDNGIiwgIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYygxLDIpLAogICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLAogICAgICAgICAgICAgICAgICAgICMgbGluZXR5cGUgPSBjKDEsMiwzLDQpLAogICAgICAgICAgICAgICAgICAgICMgY29uZi5pbnQgPSBGQUxTRSwgY29uZi5pbnQuZmlsbCA9ICIjNTk1QTVDIiwgY29uZi5pbnQuYWxwaGEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgcHZhbCA9IEZBTFNFLCBwdmFsLm1ldGhvZCA9IEZBTFNFLCBwdmFsLnNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIHJpc2sudGFibGUgPSBUUlVFLCByaXNrLnRhYmxlLnkudGV4dCA9IEZBTFNFLCB0YWJsZXMueS50ZXh0LmNvbCA9IFRSVUUsIGZvbnRzaXplID0gNCwKICAgICAgICAgICAgICAgICAgICBjZW5zb3IgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIlJpc2sgb2YgIixlcCwiIiksIHhsYWIgPSAiVGltZSBbZGF5c10iLCBmb250Lm1haW4gPSBjKDE2LCAiYm9sZCIsICJibGFjayIpKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5zdXJ2aXZhbC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi4zMGRheXMucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBvbmVmaWxlID0gRkFMU0UpCgogICAgY2F0KHBhc3RlMCgiXG4gICA+IHBlcmZvcm0gdGhlIENveC1yZWdyZXNzaW9uIGZhc2hpenpsZSBhbmQgcGxvdCBpdC4uLlxuIikpCiAgICAjIyMgRG8gQ294LXJlZ3Jlc3Npb24gYW5kIHBsb3QgaXQKICAgIAogICAgIyMjIE1PREVMIDEgKFNpbXBsZSBtb2RlbCkKICAgIGNveCA9IGNveHBoKFN1cnYoVEVNUC5ERlssZXB0aW1lXSwgZXZlbnQpIH4gVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0rQWdlK0dlbmRlciArIE9SZGF0ZV95ZWFyLCBkYXRhID0gVEVNUC5ERikKICAgIGNveHBsb3QgPSBjb3hwaChTdXJ2KFRFTVAuREZbLGVwdGltZV0sIGV2ZW50KSB+IHN0cmF0YShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkrQWdlK0dlbmRlciArIE9SZGF0ZV95ZWFyLCBkYXRhID0gVEVNUC5ERikKCiAgICBwbG90KHN1cnZmaXQoY294cGxvdCksIG1haW4gPSBwYXN0ZTAoIkNveCBwcm9wb3J0aW9uYWwgaGF6YXJkIG9mIFsiLGVwLCJdIHBlciBbIixlcHRpbWUsIl0uIiksCiAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjNTk1QTVDIiwgIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAjIHlsaW0gPSBjKDAsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgbHR5ID0gYygxLDIpLCBsd2QgPSAyLAogICAgICAgICB5bGFiID0gIlN1dml2YWwgcHJvYmFiaWxpdHkiLCB4bGFiID0gIkZVIHRpbWUgW2RheXNdIiwKICAgICAgICAgbWFyay50aW1lID0gRkFMU0UsIGF4ZXMgPSBGQUxTRSwgYnR5ID0gIm4iKQogICAgbGVnZW5kKCJ0b3ByaWdodCIsCiAgICAgICAgICAgYygibG93IiwgImhpZ2giKSwKICAgICAgICAgICB0aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICBjb2wgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICBsdHkgPSBjKDEsMiksIGx3ZCA9IDIsCiAgICAgICAgICAgYnR5ID0gIm4iKQogICAgYXhpcyhzaWRlID0gMSwgYXQgPSBzZXEoMCwgMywgYnkgPSAxKSkKICAgIGF4aXMoc2lkZSA9IDIsIGF0ID0gc2VxKDAsIDEsIGJ5ID0gMC4yKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5Db3guIixlcCwiLjJHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZGF5LCIuQUVEQi5DRUEuQ294LiIsZXAsIi40Ry4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiLk1PREVMMS4zMGRheXMucGRmIiksIGhlaWdodCA9IDEyLCB3aWR0aCA9IDEwLCBvbmVmaWxlID0gVFJVRSkKICAgIHNob3coc3VtbWFyeShjb3gpKQoKICAgIGNhdChwYXN0ZTAoIlxuICAgPiB3cml0aW5nIHRoZSBDb3gtcmVncmVzc2lvbiBmYXNoaXp6bGUgdG8gRXhjZWwuLi5cbiIpKQoKICAgIENPWC5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQogICAgQ09YLnJlc3VsdHMuVEVNUFsxLF0gPSBDT1guU1RBVChjb3gsICJBRURCLkNFQSIsIGVwLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKQogICAgQ09YLnJlc3VsdHMgPSByYmluZChDT1gucmVzdWx0cywgQ09YLnJlc3VsdHMuVEVNUCkKCiAgfQp9CgpjYXQoIi0gRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhDT1gucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIk91dGNvbWUiLCAiQ3BHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJIUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlotdmFsdWUiLCAiUC12YWx1ZSIsICJTYW1wbGVTaXplIiwgIk5fZXZlbnRzIikKCmNhdCgiLSBDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKQ09YLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJEJldGEpCkNPWC5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHMuZS5tLikKQ09YLnJlc3VsdHMkSFIgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRIUikKQ09YLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGxvdzk1Q0kpCkNPWC5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHVwOTVDSSkKQ09YLnJlc3VsdHMkYFotdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFotdmFsdWVgKQpDT1gucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRgUC12YWx1ZWApCkNPWC5yZXN1bHRzJFNhbXBsZVNpemUgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRTYW1wbGVTaXplKQpDT1gucmVzdWx0cyROX2V2ZW50cyA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJE5fZXZlbnRzKQoKQUVEQi5DRUEuQ09YLnJlc3VsdHMgPC0gQ09YLnJlc3VsdHMKCiMgU2F2ZSB0aGUgZGF0YQpsaWJyYXJ5KG9wZW54bHN4KQpjYXQoIi0gV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCmhlYWQuc3R5bGUgPC0gY3JlYXRlU3R5bGUodGV4dERlY29yYXRpb24gPSAiQk9MRCIpCndyaXRlLnhsc3goQUVEQi5DRUEuQ09YLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db3guMkcuTU9ERUwxLjMwZGF5cy54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQojcm0oVEVNUC5ERiwgcHJvdGVpbiwgZml0LCBjb3gsIGNveHBsb3QsIENPWC5yZXN1bHRzLCBDT1gucmVzdWx0cy5URU1QLCBoZWFkLnN0eWxlLCBBRURCLkNFQS5DT1gucmVzdWx0cykKCiNybShoZWFkLnN0eWxlKQoKYGBgCgoqTU9ERUwgMioKYGBge3IgQ294LXJlZ3Jlc3Npb24gQW5hbHlzaXM6IE1PREVMIDIsIDMwIGRheXN9CiMgU2V0IHVwIGEgZGF0YWZyYW1lIHRvIHJlY2VpdmUgcmVzdWx0cwpDT1gucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDEyLCBucm93ID0gMCkpCgojIExvb3Bpbmcgb3ZlciBlYWNoIHByb3RlaW4vZW5kcG9pbnQvdGltZSBjb21iaW5hdGlvbgpmb3IgKGkgaW4gMTpsZW5ndGgodGltZXMzMCkpewogIGVwdGltZSA9IHRpbWVzMzBbaV0KICBlcCA9IGVuZHBvaW50czMwW2ldCiAgY2F0KHBhc3RlMCgiKiBBbmFseXppbmcgdGhlIGVmZmVjdCBvZiBwbGFxdWUgcHJvdGVpbnMgb24gWyIsZXAsIl0uXG4iKSkKICBjYXQoIiAtIGNyZWF0aW5nIHRlbXBvcmFyeSBTRSBmb3IgdGhpcyB3b3JrLlxuIikKICBURU1QLkRGID0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSkKICBjYXQoIiAtIG1ha2luZyBhICdTdXJ2JyBvYmplY3QgYW5kIGFkZGluZyB0aGlzIHRvIHRlbXBvcmFyeSBkYXRhZnJhbWUuXG4iKQogIFRFTVAuREYkZXZlbnQgPC0gYXMuaW50ZWdlcihURU1QLkRGWyxlcF0pCiAgI2FzLmludGVnZXIoVEVNUC5ERlssZXBdID09ICJFeGNsdWRlZCIpCgogIFRFTVAuREYkeSA8LSBTdXJ2KHRpbWUgPSBURU1QLkRGWyxlcHRpbWVdLCBldmVudCA9IFRFTVAuREYkZXZlbnQpCiAgY2F0KCIgLSBtYWtpbmcgc3RyYXRhIG9mIGVhY2ggb2YgdGhlIHBsYXF1ZSBwcm90ZWlucyBhbmQgc3RhcnQgc3Vydml2YWwgYW5hbHlzaXMuXG4iKQogIAogIGZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSl7CiAgICBjYXQocGFzdGUwKCIgICA+IHByb2Nlc3NpbmcgWyIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiXTsgIixwcm90ZWluLCIgb3V0IG9mICIsbGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspLCIgcHJvdGVpbnMuXG4iKSkKICAgICMgc3BsaXR0aW5nIGludG8gdHdvIGdyb3VwcwogICAgVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0gPC0gY3V0MihURU1QLkRGWyxUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dXSwgZyA9IDIpCiAgICBjYXQocGFzdGUwKCIgICA+IGNyb3NzIHRhYnVsYXRpb24gb2YgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgc2hvdyh0YWJsZShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBmaXR0aW5nIHRoZSBtb2RlbCBmb3IgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgZml0IDwtIHN1cnZmaXQoYXMuZm9ybXVsYShwYXN0ZTAoInkgfiAiLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKSksIGRhdGEgPSBURU1QLkRGKQogICAgCiAgICBjYXQocGFzdGUwKCJcbiAgID4gbWFrZSBhIEthcGxhbi1NZWllci1zaGl6emxlLi4uXG4iKSkKICAgICMgbWFrZSBLYXBsYW4tTWVpZXIgY3VydmUgYW5kIHNhdmUgaXQKICAgIHNob3coZ2dzdXJ2cGxvdChmaXQsIGRhdGEgPSBURU1QLkRGLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICAjIHBhbGV0ZSA9IGMoIkY1OUQxMCIsICIjREIwMDNGIiwgIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYygxLDIpLAogICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLAogICAgICAgICAgICAgICAgICAgICMgbGluZXR5cGUgPSBjKDEsMiwzLDQpLAogICAgICAgICAgICAgICAgICAgICMgY29uZi5pbnQgPSBGQUxTRSwgY29uZi5pbnQuZmlsbCA9ICIjNTk1QTVDIiwgY29uZi5pbnQuYWxwaGEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgcHZhbCA9IEZBTFNFLCBwdmFsLm1ldGhvZCA9IEZBTFNFLCBwdmFsLnNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIHJpc2sudGFibGUgPSBUUlVFLCByaXNrLnRhYmxlLnkudGV4dCA9IEZBTFNFLCB0YWJsZXMueS50ZXh0LmNvbCA9IFRSVUUsIGZvbnRzaXplID0gNCwKICAgICAgICAgICAgICAgICAgICBjZW5zb3IgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIlJpc2sgb2YgIixlcCwiIiksIHhsYWIgPSAiVGltZSBbZGF5c10iLCBmb250Lm1haW4gPSBjKDE2LCAiYm9sZCIsICJibGFjayIpKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5zdXJ2aXZhbC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi4zMGRheXMucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBvbmVmaWxlID0gRkFMU0UpCgogICAgY2F0KHBhc3RlMCgiXG4gICA+IHBlcmZvcm0gdGhlIENveC1yZWdyZXNzaW9uIGZhc2hpenpsZSBhbmQgcGxvdCBpdC4uLlxuIikpCiAgICAjIyMgRG8gQ294LXJlZ3Jlc3Npb24gYW5kIHBsb3QgaXQKICAgIAogICAgIyMjIE1PREVMIDIgYWRqdXN0ZWQgZm9yIGFnZSwgc2V4LCBoeXBlcnRlbnNpb24sIGRpYWJldGVzLCBzbW9raW5nLCBMREwtQyBsZXZlbHMsIGxpcGlkLWxvd2VyaW5nIGRydWdzLCBhbnRpcGxhdGVsZXQgZHJ1Z3MsIGVHRlIsIEJNSSwgaGlzdG9yeSBvZiBDVkQsIGxldmVsIG9mIHN0ZW5vc2lzCiAgICBjb3ggPSBjb3hwaChTdXJ2KFRFTVAuREZbLGVwdGltZV0sIGV2ZW50KSB+IFRFTVAuREZbWyBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dIF1dK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCiAgICBjb3hwbG90ID0gY294cGgoU3VydihURU1QLkRGWyxlcHRpbWVdLCBldmVudCkgfiBzdHJhdGEoVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0pK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCgogIAogICAgcGxvdChzdXJ2Zml0KGNveHBsb3QpLCBtYWluID0gcGFzdGUwKCJDb3ggcHJvcG9ydGlvbmFsIGhhemFyZCBvZiBbIixlcCwiXSBwZXIgWyIsZXB0aW1lLCJdLiIpLAogICAgICAgICB5bGltID0gYygwLjc1LCAxKSwgeGxpbSA9IGMoMCwzKSwgY29sID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICMgeWxpbSA9IGMoMCwgMSksIHhsaW0gPSBjKDAsMyksIGNvbCA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICBsdHkgPSBjKDEsMiksIGx3ZCA9IDIsCiAgICAgICAgIHlsYWIgPSAiU3V2aXZhbCBwcm9iYWJpbGl0eSIsIHhsYWIgPSAiRlUgdGltZSBbZGF5c10iLAogICAgICAgICBtYXJrLnRpbWUgPSBGQUxTRSwgYXhlcyA9IEZBTFNFLCBidHkgPSAibiIpCiAgICBsZWdlbmQoInRvcHJpZ2h0IiwKICAgICAgICAgICBjKCJsb3ciLCAiaGlnaCIpLAogICAgICAgICAgIHRpdGxlID0gcGFzdGUwKCIiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIiIpLAogICAgICAgICAgIGNvbCA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAgIGx0eSA9IGMoMSwyKSwgbHdkID0gMiwKICAgICAgICAgICBidHkgPSAibiIpCiAgICBheGlzKHNpZGUgPSAxLCBhdCA9IHNlcSgwLCAzLCBieSA9IDEpKQogICAgYXhpcyhzaWRlID0gMiwgYXQgPSBzZXEoMCwgMSwgYnkgPSAwLjIpKQogICAgZGV2LmNvcHkycGRmKGZpbGUgPSBwYXN0ZTAoQ09YX2xvYywiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2RheSwiLkFFREIuQ0VBLkNveC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kYXksIi5BRURCLkNFQS5Db3guIixlcCwiLjRHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIuTU9ERUwyLjMwZGF5cy5wZGYiKSwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gMTAsIG9uZWZpbGUgPSBUUlVFKQoKICAgIHNob3coc3VtbWFyeShjb3gpKQoKICAgIGNhdChwYXN0ZTAoIlxuICAgPiB3cml0aW5nIHRoZSBDb3gtcmVncmVzc2lvbiBmYXNoaXp6bGUgdG8gRXhjZWwuLi5cbiIpKQoKICAgIENPWC5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQogICAgQ09YLnJlc3VsdHMuVEVNUFsxLF0gPSBDT1guU1RBVChjb3gsICJBRURCLkNFQSIsIGVwLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKQogICAgQ09YLnJlc3VsdHMgPSByYmluZChDT1gucmVzdWx0cywgQ09YLnJlc3VsdHMuVEVNUCkKCiAgfQp9CgpjYXQoIi0gRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhDT1gucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIk91dGNvbWUiLCAiQ3BHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJIUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlotdmFsdWUiLCAiUC12YWx1ZSIsICJTYW1wbGVTaXplIiwgIk5fZXZlbnRzIikKCmNhdCgiLSBDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKQ09YLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJEJldGEpCkNPWC5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHMuZS5tLikKQ09YLnJlc3VsdHMkSFIgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRIUikKQ09YLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGxvdzk1Q0kpCkNPWC5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHVwOTVDSSkKQ09YLnJlc3VsdHMkYFotdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFotdmFsdWVgKQpDT1gucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRgUC12YWx1ZWApCkNPWC5yZXN1bHRzJFNhbXBsZVNpemUgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRTYW1wbGVTaXplKQpDT1gucmVzdWx0cyROX2V2ZW50cyA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJE5fZXZlbnRzKQoKQUVEQi5DRUEuQ09YLnJlc3VsdHMgPC0gQ09YLnJlc3VsdHMKCiMgU2F2ZSB0aGUgZGF0YQpjYXQoIi0gV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCmhlYWQuc3R5bGUgPC0gY3JlYXRlU3R5bGUodGV4dERlY29yYXRpb24gPSAiQk9MRCIpCndyaXRlLnhsc3goQUVEQi5DRUEuQ09YLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db3guMkcuTU9ERUwyLjMwZGF5cy54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQpybShURU1QLkRGLCBwcm90ZWluLCBmaXQsIGNveCwgY294cGxvdCwgQ09YLnJlc3VsdHMsIENPWC5yZXN1bHRzLlRFTVAsIGhlYWQuc3R5bGUsIEFFREIuQ0VBLkNPWC5yZXN1bHRzKQoKcm0oaGVhZC5zdHlsZSkKCmBgYAoKCiMjIyMgOTAtZGF5cyBmb2xsb3ctdXAKCipNT0RFTCAxKgpgYGB7ciBDb3gtcmVncmVzc2lvbiBBbmFseXNpczogU2ltcGxlIG1vZGVsLCA5MCBkYXlzfQojIFNldCB1cCBhIGRhdGFmcmFtZSB0byByZWNlaXZlIHJlc3VsdHMKQ09YLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQoKIyBMb29waW5nIG92ZXIgZWFjaCBwcm90ZWluL2VuZHBvaW50L3RpbWUgY29tYmluYXRpb24KZm9yIChpIGluIDE6bGVuZ3RoKHRpbWVzOTApKXsKICBlcHRpbWUgPSB0aW1lczkwW2ldCiAgZXAgPSBlbmRwb2ludHM5MFtpXQogIGNhdChwYXN0ZTAoIiogQW5hbHl6aW5nIHRoZSBlZmZlY3Qgb2YgcGxhcXVlIHByb3RlaW5zIG9uIFsiLGVwLCJdLlxuIikpCiAgY2F0KCIgLSBjcmVhdGluZyB0ZW1wb3JhcnkgU0UgZm9yIHRoaXMgd29yay5cbiIpCiAgVEVNUC5ERiA9IGFzLmRhdGEuZnJhbWUoQUVEQi5DRUEpCiAgY2F0KCIgLSBtYWtpbmcgYSAnU3Vydicgb2JqZWN0IGFuZCBhZGRpbmcgdGhpcyB0byB0ZW1wb3JhcnkgZGF0YWZyYW1lLlxuIikKICBURU1QLkRGJGV2ZW50IDwtIGFzLmludGVnZXIoVEVNUC5ERlssZXBdKQogIFRFTVAuREYkeSA8LSBTdXJ2KHRpbWUgPSBURU1QLkRGWyxlcHRpbWVdLCBldmVudCA9IFRFTVAuREYkZXZlbnQpCiAgY2F0KCIgLSBtYWtpbmcgc3RyYXRhIG9mIGVhY2ggb2YgdGhlIHBsYXF1ZSBwcm90ZWlucyBhbmQgc3RhcnQgc3Vydml2YWwgYW5hbHlzaXMuXG4iKQogIAogIGZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSl7CiAgICBjYXQocGFzdGUwKCIgICA+IHByb2Nlc3NpbmcgWyIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiXTsgIixwcm90ZWluLCIgb3V0IG9mICIsbGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspLCIgcHJvdGVpbnMuXG4iKSkKICAgICMgc3BsaXR0aW5nIGludG8gdHdvIGdyb3VwcwogICAgVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0gPC0gY3V0MihURU1QLkRGWyxUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dXSwgZyA9IDIpCiAgICBjYXQocGFzdGUwKCIgICA+IGNyb3NzIHRhYnVsYXRpb24gb2YgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgc2hvdyh0YWJsZShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBmaXR0aW5nIHRoZSBtb2RlbCBmb3IgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgZml0IDwtIHN1cnZmaXQoYXMuZm9ybXVsYShwYXN0ZTAoInkgfiAiLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKSksIGRhdGEgPSBURU1QLkRGKQogICAgCiAgICBjYXQocGFzdGUwKCJcbiAgID4gbWFrZSBhIEthcGxhbi1NZWllci1zaGl6emxlLi4uXG4iKSkKICAgICMgbWFrZSBLYXBsYW4tTWVpZXIgY3VydmUgYW5kIHNhdmUgaXQKICAgIHNob3coZ2dzdXJ2cGxvdChmaXQsIGRhdGEgPSBURU1QLkRGLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICAjIHBhbGV0ZSA9IGMoIkY1OUQxMCIsICIjREIwMDNGIiwgIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYygxLDIpLAogICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLAogICAgICAgICAgICAgICAgICAgICMgbGluZXR5cGUgPSBjKDEsMiwzLDQpLAogICAgICAgICAgICAgICAgICAgICMgY29uZi5pbnQgPSBGQUxTRSwgY29uZi5pbnQuZmlsbCA9ICIjNTk1QTVDIiwgY29uZi5pbnQuYWxwaGEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgcHZhbCA9IEZBTFNFLCBwdmFsLm1ldGhvZCA9IEZBTFNFLCBwdmFsLnNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIHJpc2sudGFibGUgPSBUUlVFLCByaXNrLnRhYmxlLnkudGV4dCA9IEZBTFNFLCB0YWJsZXMueS50ZXh0LmNvbCA9IFRSVUUsIGZvbnRzaXplID0gNCwKICAgICAgICAgICAgICAgICAgICBjZW5zb3IgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIlJpc2sgb2YgIixlcCwiIiksIHhsYWIgPSAiVGltZSBbZGF5c10iLCBmb250Lm1haW4gPSBjKDE2LCAiYm9sZCIsICJibGFjayIpKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5zdXJ2aXZhbC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi45MGRheXMucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBvbmVmaWxlID0gRkFMU0UpCgogICAgY2F0KHBhc3RlMCgiXG4gICA+IHBlcmZvcm0gdGhlIENveC1yZWdyZXNzaW9uIGZhc2hpenpsZSBhbmQgcGxvdCBpdC4uLlxuIikpCiAgICAjIyMgRG8gQ294LXJlZ3Jlc3Npb24gYW5kIHBsb3QgaXQKICAgIAogICAgIyMjIE1PREVMIDEgKFNpbXBsZSBtb2RlbCkKICAgIGNveCA9IGNveHBoKFN1cnYoVEVNUC5ERlssZXB0aW1lXSwgZXZlbnQpIH4gVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0rQWdlK0dlbmRlciArIE9SZGF0ZV95ZWFyLCBkYXRhID0gVEVNUC5ERikKICAgIGNveHBsb3QgPSBjb3hwaChTdXJ2KFRFTVAuREZbLGVwdGltZV0sIGV2ZW50KSB+IHN0cmF0YShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkrQWdlK0dlbmRlciArIE9SZGF0ZV95ZWFyLCBkYXRhID0gVEVNUC5ERikKCiAgICBwbG90KHN1cnZmaXQoY294cGxvdCksIG1haW4gPSBwYXN0ZTAoIkNveCBwcm9wb3J0aW9uYWwgaGF6YXJkIG9mIFsiLGVwLCJdIHBlciBbIixlcHRpbWUsIl0uIiksCiAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjNTk1QTVDIiwgIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAjIHlsaW0gPSBjKDAsIDEpLCB4bGltID0gYygwLDMpLCBjb2wgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgbHR5ID0gYygxLDIpLCBsd2QgPSAyLAogICAgICAgICB5bGFiID0gIlN1dml2YWwgcHJvYmFiaWxpdHkiLCB4bGFiID0gIkZVIHRpbWUgW2RheXNdIiwKICAgICAgICAgbWFyay50aW1lID0gRkFMU0UsIGF4ZXMgPSBGQUxTRSwgYnR5ID0gIm4iKQogICAgbGVnZW5kKCJ0b3ByaWdodCIsCiAgICAgICAgICAgYygibG93IiwgImhpZ2giKSwKICAgICAgICAgICB0aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICBjb2wgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICBsdHkgPSBjKDEsMiksIGx3ZCA9IDIsCiAgICAgICAgICAgYnR5ID0gIm4iKQogICAgYXhpcyhzaWRlID0gMSwgYXQgPSBzZXEoMCwgMywgYnkgPSAxKSkKICAgIGF4aXMoc2lkZSA9IDIsIGF0ID0gc2VxKDAsIDEsIGJ5ID0gMC4yKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5Db3guIixlcCwiLjJHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZGF5LCIuQUVEQi5DRUEuQ294LiIsZXAsIi40Ry4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiLk1PREVMMS45MGRheXMucGRmIiksIGhlaWdodCA9IDEyLCB3aWR0aCA9IDEwLCBvbmVmaWxlID0gVFJVRSkKICAgIHNob3coc3VtbWFyeShjb3gpKQoKICAgIGNhdChwYXN0ZTAoIlxuICAgPiB3cml0aW5nIHRoZSBDb3gtcmVncmVzc2lvbiBmYXNoaXp6bGUgdG8gRXhjZWwuLi5cbiIpKQoKICAgIENPWC5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQogICAgQ09YLnJlc3VsdHMuVEVNUFsxLF0gPSBDT1guU1RBVChjb3gsICJBRURCLkNFQSIsIGVwLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKQogICAgQ09YLnJlc3VsdHMgPSByYmluZChDT1gucmVzdWx0cywgQ09YLnJlc3VsdHMuVEVNUCkKCiAgfQp9CgpjYXQoIi0gRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhDT1gucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIk91dGNvbWUiLCAiQ3BHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJIUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlotdmFsdWUiLCAiUC12YWx1ZSIsICJTYW1wbGVTaXplIiwgIk5fZXZlbnRzIikKCmNhdCgiLSBDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKQ09YLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJEJldGEpCkNPWC5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHMuZS5tLikKQ09YLnJlc3VsdHMkSFIgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRIUikKQ09YLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGxvdzk1Q0kpCkNPWC5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHVwOTVDSSkKQ09YLnJlc3VsdHMkYFotdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFotdmFsdWVgKQpDT1gucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRgUC12YWx1ZWApCkNPWC5yZXN1bHRzJFNhbXBsZVNpemUgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRTYW1wbGVTaXplKQpDT1gucmVzdWx0cyROX2V2ZW50cyA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJE5fZXZlbnRzKQoKQUVEQi5DRUEuQ09YLnJlc3VsdHMgPC0gQ09YLnJlc3VsdHMKCiMgU2F2ZSB0aGUgZGF0YQpsaWJyYXJ5KG9wZW54bHN4KQpjYXQoIi0gV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCmhlYWQuc3R5bGUgPC0gY3JlYXRlU3R5bGUodGV4dERlY29yYXRpb24gPSAiQk9MRCIpCndyaXRlLnhsc3goQUVEQi5DRUEuQ09YLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db3guMkcuTU9ERUwxLjkwZGF5cy54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQojcm0oVEVNUC5ERiwgcHJvdGVpbiwgZml0LCBjb3gsIGNveHBsb3QsIENPWC5yZXN1bHRzLCBDT1gucmVzdWx0cy5URU1QLCBoZWFkLnN0eWxlLCBBRURCLkNFQS5DT1gucmVzdWx0cykKCiNybShoZWFkLnN0eWxlKQoKYGBgCgoqTU9ERUwgMioKYGBge3IgQ294LXJlZ3Jlc3Npb24gQW5hbHlzaXM6IE1PREVMIDIsIDkwIGRheXN9CiMgU2V0IHVwIGEgZGF0YWZyYW1lIHRvIHJlY2VpdmUgcmVzdWx0cwpDT1gucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDEyLCBucm93ID0gMCkpCgojIExvb3Bpbmcgb3ZlciBlYWNoIHByb3RlaW4vZW5kcG9pbnQvdGltZSBjb21iaW5hdGlvbgpmb3IgKGkgaW4gMTpsZW5ndGgodGltZXM5MCkpewogIGVwdGltZSA9IHRpbWVzOTBbaV0KICBlcCA9IGVuZHBvaW50czkwW2ldCiAgY2F0KHBhc3RlMCgiKiBBbmFseXppbmcgdGhlIGVmZmVjdCBvZiBwbGFxdWUgcHJvdGVpbnMgb24gWyIsZXAsIl0uXG4iKSkKICBjYXQoIiAtIGNyZWF0aW5nIHRlbXBvcmFyeSBTRSBmb3IgdGhpcyB3b3JrLlxuIikKICBURU1QLkRGID0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSkKICBjYXQoIiAtIG1ha2luZyBhICdTdXJ2JyBvYmplY3QgYW5kIGFkZGluZyB0aGlzIHRvIHRlbXBvcmFyeSBkYXRhZnJhbWUuXG4iKQogIFRFTVAuREYkZXZlbnQgPC0gYXMuaW50ZWdlcihURU1QLkRGWyxlcF0pCiAgI2FzLmludGVnZXIoVEVNUC5ERlssZXBdID09ICJFeGNsdWRlZCIpCgogIFRFTVAuREYkeSA8LSBTdXJ2KHRpbWUgPSBURU1QLkRGWyxlcHRpbWVdLCBldmVudCA9IFRFTVAuREYkZXZlbnQpCiAgY2F0KCIgLSBtYWtpbmcgc3RyYXRhIG9mIGVhY2ggb2YgdGhlIHBsYXF1ZSBwcm90ZWlucyBhbmQgc3RhcnQgc3Vydml2YWwgYW5hbHlzaXMuXG4iKQogIAogIGZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSl7CiAgICBjYXQocGFzdGUwKCIgICA+IHByb2Nlc3NpbmcgWyIsVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSwiXTsgIixwcm90ZWluLCIgb3V0IG9mICIsbGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspLCIgcHJvdGVpbnMuXG4iKSkKICAgICMgc3BsaXR0aW5nIGludG8gdHdvIGdyb3VwcwogICAgVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0gPC0gY3V0MihURU1QLkRGWyxUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dXSwgZyA9IDIpCiAgICBjYXQocGFzdGUwKCIgICA+IGNyb3NzIHRhYnVsYXRpb24gb2YgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgc2hvdyh0YWJsZShURU1QLkRGW1sgVFJBSVRTLlBST1RFSU4uUkFOS1twcm90ZWluXSBdXSkpCiAgICAKICAgIGNhdChwYXN0ZTAoIlxuICAgPiBmaXR0aW5nIHRoZSBtb2RlbCBmb3IgIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCItc3RyYXR1bS5cbiIpKQogICAgZml0IDwtIHN1cnZmaXQoYXMuZm9ybXVsYShwYXN0ZTAoInkgfiAiLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKSksIGRhdGEgPSBURU1QLkRGKQogICAgCiAgICBjYXQocGFzdGUwKCJcbiAgID4gbWFrZSBhIEthcGxhbi1NZWllci1zaGl6emxlLi4uXG4iKSkKICAgICMgbWFrZSBLYXBsYW4tTWVpZXIgY3VydmUgYW5kIHNhdmUgaXQKICAgIHNob3coZ2dzdXJ2cGxvdChmaXQsIGRhdGEgPSBURU1QLkRGLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjREIwMDNGIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgICAjIHBhbGV0ZSA9IGMoIkY1OUQxMCIsICIjREIwMDNGIiwgIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYygxLDIpLAogICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAuNzUsIDEpLAogICAgICAgICAgICAgICAgICAgICMgbGluZXR5cGUgPSBjKDEsMiwzLDQpLAogICAgICAgICAgICAgICAgICAgICMgY29uZi5pbnQgPSBGQUxTRSwgY29uZi5pbnQuZmlsbCA9ICIjNTk1QTVDIiwgY29uZi5pbnQuYWxwaGEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgcHZhbCA9IEZBTFNFLCBwdmFsLm1ldGhvZCA9IEZBTFNFLCBwdmFsLnNpemUgPSA0LAogICAgICAgICAgICAgICAgICAgIHJpc2sudGFibGUgPSBUUlVFLCByaXNrLnRhYmxlLnkudGV4dCA9IEZBTFNFLCB0YWJsZXMueS50ZXh0LmNvbCA9IFRSVUUsIGZvbnRzaXplID0gNCwKICAgICAgICAgICAgICAgICAgICBjZW5zb3IgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IHBhc3RlMCgiIixUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIiKSwKICAgICAgICAgICAgICAgICAgICBsZWdlbmQubGFicyA9IGMoImxvdyIsICJoaWdoIiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwYXN0ZTAoIlJpc2sgb2YgIixlcCwiIiksIHhsYWIgPSAiVGltZSBbZGF5c10iLCBmb250Lm1haW4gPSBjKDE2LCAiYm9sZCIsICJibGFjayIpKSkKICAgIGRldi5jb3B5MnBkZihmaWxlID0gcGFzdGUwKENPWF9sb2MsIi8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9kYXksIi5BRURCLkNFQS5zdXJ2aXZhbC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIi45MGRheXMucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDEwLCBvbmVmaWxlID0gRkFMU0UpCgogICAgY2F0KHBhc3RlMCgiXG4gICA+IHBlcmZvcm0gdGhlIENveC1yZWdyZXNzaW9uIGZhc2hpenpsZSBhbmQgcGxvdCBpdC4uLlxuIikpCiAgICAjIyMgRG8gQ294LXJlZ3Jlc3Npb24gYW5kIHBsb3QgaXQKICAgIAogICAgIyMjIE1PREVMIDIgYWRqdXN0ZWQgZm9yIGFnZSwgc2V4LCBoeXBlcnRlbnNpb24sIGRpYWJldGVzLCBzbW9raW5nLCBMREwtQyBsZXZlbHMsIGxpcGlkLWxvd2VyaW5nIGRydWdzLCBhbnRpcGxhdGVsZXQgZHJ1Z3MsIGVHRlIsIEJNSSwgaGlzdG9yeSBvZiBDVkQsIGxldmVsIG9mIHN0ZW5vc2lzCiAgICBjb3ggPSBjb3hwaChTdXJ2KFRFTVAuREZbLGVwdGltZV0sIGV2ZW50KSB+IFRFTVAuREZbWyBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dIF1dK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCiAgICBjb3hwbG90ID0gY294cGgoU3VydihURU1QLkRGWyxlcHRpbWVdLCBldmVudCkgfiBzdHJhdGEoVEVNUC5ERltbIFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0gXV0pK0FnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyICsgSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSArIERpYWJldGVzU3RhdHVzICsgU21va2VyU3RhdHVzICsgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgTWVkSHhfQ1ZEICsgc3Rlbm9zZSwgZGF0YSA9IFRFTVAuREYpCgogIAogICAgcGxvdChzdXJ2Zml0KGNveHBsb3QpLCBtYWluID0gcGFzdGUwKCJDb3ggcHJvcG9ydGlvbmFsIGhhemFyZCBvZiBbIixlcCwiXSBwZXIgWyIsZXB0aW1lLCJdLiIpLAogICAgICAgICB5bGltID0gYygwLjc1LCAxKSwgeGxpbSA9IGMoMCwzKSwgY29sID0gYygiI0RCMDAzRiIsICIjMTI5MEQ5IiksCiAgICAgICAgICMgeWxpbSA9IGMoMCwgMSksIHhsaW0gPSBjKDAsMyksIGNvbCA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICBsdHkgPSBjKDEsMiksIGx3ZCA9IDIsCiAgICAgICAgIHlsYWIgPSAiU3V2aXZhbCBwcm9iYWJpbGl0eSIsIHhsYWIgPSAiRlUgdGltZSBbZGF5c10iLAogICAgICAgICBtYXJrLnRpbWUgPSBGQUxTRSwgYXhlcyA9IEZBTFNFLCBidHkgPSAibiIpCiAgICBsZWdlbmQoInRvcHJpZ2h0IiwKICAgICAgICAgICBjKCJsb3ciLCAiaGlnaCIpLAogICAgICAgICAgIHRpdGxlID0gcGFzdGUwKCIiLFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0sIiIpLAogICAgICAgICAgIGNvbCA9IGMoIiNEQjAwM0YiLCAiIzEyOTBEOSIpLAogICAgICAgICAgIGx0eSA9IGMoMSwyKSwgbHdkID0gMiwKICAgICAgICAgICBidHkgPSAibiIpCiAgICBheGlzKHNpZGUgPSAxLCBhdCA9IHNlcSgwLCAzLCBieSA9IDEpKQogICAgYXhpcyhzaWRlID0gMiwgYXQgPSBzZXEoMCwgMSwgYnkgPSAwLjIpKQogICAgZGV2LmNvcHkycGRmKGZpbGUgPSBwYXN0ZTAoQ09YX2xvYywiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2RheSwiLkFFREIuQ0VBLkNveC4iLGVwLCIuMkcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kYXksIi5BRURCLkNFQS5Db3guIixlcCwiLjRHLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dLCIuTU9ERUwyLjkwZGF5cy5wZGYiKSwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gMTAsIG9uZWZpbGUgPSBUUlVFKQoKICAgIHNob3coc3VtbWFyeShjb3gpKQoKICAgIGNhdChwYXN0ZTAoIlxuICAgPiB3cml0aW5nIHRoZSBDb3gtcmVncmVzc2lvbiBmYXNoaXp6bGUgdG8gRXhjZWwuLi5cbiIpKQoKICAgIENPWC5yZXN1bHRzLlRFTVAgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxMiwgbnJvdyA9IDApKQogICAgQ09YLnJlc3VsdHMuVEVNUFsxLF0gPSBDT1guU1RBVChjb3gsICJBRURCLkNFQSIsIGVwLCBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dKQogICAgQ09YLnJlc3VsdHMgPSByYmluZChDT1gucmVzdWx0cywgQ09YLnJlc3VsdHMuVEVNUCkKCiAgfQp9CgpjYXQoIi0gRWRpdCB0aGUgY29sdW1uIG5hbWVzLi4uXG4iKQpjb2xuYW1lcyhDT1gucmVzdWx0cykgPSBjKCJEYXRhc2V0IiwgIk91dGNvbWUiLCAiQ3BHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQmV0YSIsICJzLmUubS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJIUiIsICJsb3c5NUNJIiwgInVwOTVDSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlotdmFsdWUiLCAiUC12YWx1ZSIsICJTYW1wbGVTaXplIiwgIk5fZXZlbnRzIikKCmNhdCgiLSBDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKQ09YLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJEJldGEpCkNPWC5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHMuZS5tLikKQ09YLnJlc3VsdHMkSFIgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRIUikKQ09YLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJGxvdzk1Q0kpCkNPWC5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJHVwOTVDSSkKQ09YLnJlc3VsdHMkYFotdmFsdWVgIDwtIGFzLm51bWVyaWMoQ09YLnJlc3VsdHMkYFotdmFsdWVgKQpDT1gucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRgUC12YWx1ZWApCkNPWC5yZXN1bHRzJFNhbXBsZVNpemUgPC0gYXMubnVtZXJpYyhDT1gucmVzdWx0cyRTYW1wbGVTaXplKQpDT1gucmVzdWx0cyROX2V2ZW50cyA8LSBhcy5udW1lcmljKENPWC5yZXN1bHRzJE5fZXZlbnRzKQoKQUVEQi5DRUEuQ09YLnJlc3VsdHMgPC0gQ09YLnJlc3VsdHMKCiMgU2F2ZSB0aGUgZGF0YQpjYXQoIi0gV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCmhlYWQuc3R5bGUgPC0gY3JlYXRlU3R5bGUodGV4dERlY29yYXRpb24gPSAiQk9MRCIpCndyaXRlLnhsc3goQUVEQi5DRUEuQ09YLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db3guMkcuTU9ERUwyLjkwZGF5cy54bHN4IiksCiAgICAgICAgICAgY3JlYXRvciA9ICJTYW5kZXIgVy4gdmFuIGRlciBMYWFuIiwKICAgICAgICAgICBzaGVldE5hbWUgPSAiUmVzdWx0cyIsIGhlYWRlclN0eWxlID0gaGVhZC5zdHlsZSwKICAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIi0gUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQpybShURU1QLkRGLCBwcm90ZWluLCBmaXQsIGNveCwgY294cGxvdCwgQ09YLnJlc3VsdHMsIENPWC5yZXN1bHRzLlRFTVAsIGhlYWQuc3R5bGUsIEFFREIuQ0VBLkNPWC5yZXN1bHRzKQoKcm0oaGVhZC5zdHlsZSkKCmBgYAoKCgojIENvcnJlbGF0aW9ucwoKIyMgQWxsIGJpb21hcmtlcnMKV2UgY29ycmVsYXRlZCBwbGFzbWEgYW5kIHBsYXF1ZSBsZXZlbHMgb2YgdGhlIGJpb21hcmtlcnMuCgpgYGB7ciBDcm9zc1NhbXBsZVR5cGUgQ29ycmVsYXRpb25zfQoKIyBJbnN0YWxsYXRpb24gb2YgZ2djb3JycGxvdCgpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYoIXJlcXVpcmUoZGV2dG9vbHMpKSAKICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigia2Fzc2FtYmFyYS9nZ2NvcnJwbG90IikKCmxpYnJhcnkoZ2djb3JycGxvdCkKCgojIENyZWF0aW5nIG1hdHJpeCAtIGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gYygiSUw2X3JhbmsiLCAiTUNQMV9yYW5rIiwgIklMNl9wZ191Z18yMDE1X3JhbmsiLCAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAiSUw2Ul9wZ191Z18yMDE1X3JhbmsiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTLkJJTiwgVFJBSVRTLkNPTi5SQU5LKQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIyBBRURCLkNFQS50ZW1wIDwtIHN1YnNldChBRURCLkNFQSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgPSBjKCJNQ1AxX3JhbmsiLCAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTLkJJTiwgVFJBSVRTLkNPTi5SQU5LKQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFMuQklOLCBUUkFJVFMuQ09OLlJBTkspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCgpBRURCLkNFQS50ZW1wJENhbGNpZmljYXRpb25QbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJENhbGNpZmljYXRpb25QbGFxdWUpCkFFREIuQ0VBLnRlbXAkQ29sbGFnZW5QbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJENvbGxhZ2VuUGxhcXVlKQpBRURCLkNFQS50ZW1wJEZhdDEwUGVyYyA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkRmF0MTBQZXJjKQpBRURCLkNFQS50ZW1wJElQSCA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkSVBIKQpBRURCLkNFQS50ZW1wJE1BQ19iaW5uZWQgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJE1BQ19iaW5uZWQpCkFFREIuQ0VBLnRlbXAkU01DX2Jpbm5lZCA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkU01DX2Jpbm5lZCkKc3RyKEFFREIuQ0VBLnRlbXApCkFFREIuQ0VBLm1hdHJpeC5SQU5LIDwtIGFzLm1hdHJpeChBRURCLkNFQS50ZW1wKQpybShBRURCLkNFQS50ZW1wKQoKY29ycl9iaW9tYXJrZXJzLnJhbmsgPC0gcm91bmQoY29yKEFFREIuQ0VBLm1hdHJpeC5SQU5LLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgI3RoZSBjb3JyZWxhdGlvbiBvciBjb3ZhcmlhbmNlIGJldHdlZW4gZWFjaCBwYWlyIG9mIHZhcmlhYmxlcyBpcyBjb21wdXRlZCB1c2luZyBhbGwgY29tcGxldGUgcGFpcnMgb2Ygb2JzZXJ2YXRpb25zIG9uIHRob3NlIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzcGVhcm1hbiIpLCAzKQojIGNvcnJfYmlvbWFya2Vycy5yYW5rCgpjb3JyX2Jpb21hcmtlcnNfcC5yYW5rIDwtIGdnY29ycnBsb3Q6OmNvcl9wbWF0KEFFREIuQ0VBLm1hdHJpeC5SQU5LLCB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgbWV0aG9kID0gInNwZWFybWFuIikKCiMgQWRkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgYXJndW1lbnQgbGFiID0gVFJVRQpnZ2NvcnJwbG90KGNvcnJfYmlvbWFya2Vycy5yYW5rLCAKICAgICAgICAgICBtZXRob2QgPSAic3F1YXJlIiwgCiAgICAgICAgICAgdHlwZSA9ICJsb3dlciIsCiAgICAgICAgICAgdGl0bGUgPSAiQ3Jvc3MgYmlvbWFya2VyIGNvcnJlbGF0aW9ucyIsIAogICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSwgbGVnZW5kLnRpdGxlID0gYnF1b3RlKCJTcGVhcm1hbidzIn5pdGFsaWMocmhvKSksCiAgICAgICAgICAgZ2d0aGVtZSA9IGdncGxvdDI6OnRoZW1lX21pbmltYWwsIG91dGxpbmUuY29sb3IgPSAiI0ZGRkZGRiIsCiAgICAgICAgICAgc2hvdy5kaWFnID0gVFJVRSwKICAgICAgICAgICBoYy5vcmRlciA9IEZBTFNFLCAKICAgICAgICAgICBsYWIgPSBGQUxTRSwKICAgICAgICAgICBkaWdpdHMgPSAzLAogICAgICAgICAgICMgcC5tYXQgPSBjb3JyX2Jpb21hcmtlcnNfcC5yYW5rLCBzaWcubGV2ZWwgPSAwLjA1LAogICAgICAgICAgIGNvbG9ycyA9IGMoIiMxMjkwRDkiLCAiI0ZGRkZGRiIsICIjRTU1NzM4IikpCgoKIyBmbGF0dGVuQ29yck1hdHJpeAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY29ybWF0IDogbWF0cml4IG9mIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMKIyBwbWF0IDogbWF0cml4IG9mIHRoZSBjb3JyZWxhdGlvbiBwLXZhbHVlcwpmbGF0dGVuQ29yck1hdHJpeCA8LSBmdW5jdGlvbihjb3JtYXQsIHBtYXQpIHsKICB1dCA8LSB1cHBlci50cmkoY29ybWF0KQogIGRhdGEuZnJhbWUoCiAgICBiaW9tYXJrZXJfcm93ID0gcm93bmFtZXMoY29ybWF0KVtyb3coY29ybWF0KVt1dF1dLAogICAgYmlvbWFya2VyX2NvbHVtbiA9IHJvd25hbWVzKGNvcm1hdClbY29sKGNvcm1hdClbdXRdXSwKICAgIHNwZWFybWFuX2NvciAgPShjb3JtYXQpW3V0XSwKICAgIHB2YWwgPSBwbWF0W3V0XQogICAgKQp9Cgpjb3JyX2Jpb21hcmtlcnMucmFuay5kZiA8LSBhcy5kYXRhLnRhYmxlKGZsYXR0ZW5Db3JyTWF0cml4KGNvcnJfYmlvbWFya2Vycy5yYW5rLCBjb3JyX2Jpb21hcmtlcnNfcC5yYW5rKSkKRFQ6OmRhdGF0YWJsZShjb3JyX2Jpb21hcmtlcnMucmFuay5kZikKCiMgY2hhcnQgb2YgYSBjb3JyZWxhdGlvbiBtYXRyaXgKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFsdGVybmF0aXZlIHNvbHV0aW9uIGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vMTk5LWNvcnJlbGF0aW9uLW1hdHJpeC13aXRoLWdnYWxseS5odG1sCmluc3RhbGwucGFja2FnZXMuYXV0bygiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQpjaGFydC5Db3JyZWxhdGlvbi5uZXcgPC0gZnVuY3Rpb24gKFIsIGhpc3RvZ3JhbSA9IFRSVUUsIG1ldGhvZCA9IGMoInBlYXJzb24iLCAia2VuZGFsbCIsIAogICAgInNwZWFybWFuIiksIC4uLikgCnsKICAgIHggPSBjaGVja0RhdGEoUiwgbWV0aG9kID0gIm1hdHJpeCIpCiAgICBpZiAobWlzc2luZyhtZXRob2QpKSAKICAgICAgICBtZXRob2QgPSBtZXRob2RbMV0KICAgIGNvcm1ldGggPC0gbWV0aG9kCiAgICBwYW5lbC5jb3IgPC0gZnVuY3Rpb24oeCwgeSwgZGlnaXRzID0gMiwgcHJlZml4ID0gIiIsIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiLCAKICAgICAgICBtZXRob2QgPSBjb3JtZXRoLCBjZXguY29yLCAuLi4pIHsKICAgICAgICB1c3IgPC0gcGFyKCJ1c3IiKQogICAgICAgIG9uLmV4aXQocGFyKHVzcikpCiAgICAgICAgcGFyKHVzciA9IGMoMCwgMSwgMCwgMSkpCiAgICAgICAgciA8LSBjb3IoeCwgeSwgdXNlID0gdXNlLCBtZXRob2QgPSBtZXRob2QpCiAgICAgICAgdHh0IDwtIGZvcm1hdChjKHIsIDAuMTIzNDU2Nzg5KSwgZGlnaXRzID0gZGlnaXRzKVsxXQogICAgICAgIHR4dCA8LSBwYXN0ZShwcmVmaXgsIHR4dCwgc2VwID0gIiIpCiAgICAgICAgaWYgKG1pc3NpbmcoY2V4LmNvcikpIAogICAgICAgICAgICBjZXggPC0gMC44L3N0cndpZHRoKHR4dCkKICAgICAgICB0ZXN0IDwtIGNvci50ZXN0KGFzLm51bWVyaWMoeCksIGFzLm51bWVyaWMoeSksIG1ldGhvZCA9IG1ldGhvZCkKICAgICAgICBTaWduaWYgPC0gc3ltbnVtKHRlc3QkcC52YWx1ZSwgY29yciA9IEZBTFNFLCBuYSA9IEZBTFNFLCAKICAgICAgICAgICAgY3V0cG9pbnRzID0gYygwLCAwLjAwMSwgMC4wMSwgMC4wNSwgMC4xLCAxKSwgc3ltYm9scyA9IGMoIioqKiIsIAogICAgICAgICAgICAgICAgIioqIiwgIioiLCAiLiIsICIgIikpCiAgICAgICAgdGV4dCgwLjUsIDAuNSwgdHh0LCBjZXggPSBjZXggKiAoYWJzKHIpICsgMC4zKS8xLjMpCiAgICAgICAgdGV4dCgwLjgsIDAuOCwgU2lnbmlmLCBjZXggPSBjZXgsIGNvbCA9IDIpCiAgICB9CiAgICBmIDwtIGZ1bmN0aW9uKHQpIHsKICAgICAgICBkbm9ybSh0LCBtZWFuID0gbWVhbih4KSwgc2QgPSBzZC54dHMoeCkpCiAgICB9CiAgICBkb3RhcmdzIDwtIGxpc3QoLi4uKQogICAgZG90YXJncyRtZXRob2QgPC0gTlVMTAogICAgcm0obWV0aG9kKQogICAgaGlzdC5wYW5lbCA9IGZ1bmN0aW9uKHgsIC4uLiA9IE5VTEwpIHsKICAgICAgICBwYXIobmV3ID0gVFJVRSkKICAgICAgICBoaXN0KHgsIGNvbCA9ICIjMTI5MEQ5IiwgcHJvYmFiaWxpdHkgPSBUUlVFLCBheGVzID0gRkFMU0UsIAogICAgICAgICMgaGlzdCh4LCBjb2wgPSAibGlnaHQgZ3JheSIsIHByb2JhYmlsaXR5ID0gVFJVRSwgYXhlcyA9IEZBTFNFLCAKICAgICAgICAgICAgbWFpbiA9ICIiLCBicmVha3MgPSAiRkQiKQogICAgICAgIGxpbmVzKGRlbnNpdHkoeCwgbmEucm0gPSBUUlVFKSwgY29sID0gIiNFNTU3MzgiLCBsd2QgPSAxKQogICAgICAgIHJ1Zyh4KQogICAgfQogICAgaWYgKGhpc3RvZ3JhbSkgCiAgICAgICAgcGFpcnMoeCwgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBwYW5lbC5zbW9vdGgsIHVwcGVyLnBhbmVsID0gcGFuZWwuY29yLCAKICAgICAgICAgICAgZGlhZy5wYW5lbCA9IGhpc3QucGFuZWwsIC4uLikKICAgIGVsc2UgcGFpcnMoeCwgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBwYW5lbC5zbW9vdGgsIHVwcGVyLnBhbmVsID0gcGFuZWwuY29yLCAuLi4pCn0KCgpjaGFydC5Db3JyZWxhdGlvbi5uZXcoQUVEQi5DRUEubWF0cml4LlJBTkssIG1ldGhvZCA9ICJzcGVhcm1hbiIsIGhpc3RvZ3JhbSA9IFRSVUUsIHBjaCA9IDMpCgoKIyBhbHRlcm5hdGl2ZSBjaGFydCBvZiBhIGNvcnJlbGF0aW9uIG1hdHJpeAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQWx0ZXJuYXRpdmUgc29sdXRpb24gaHR0cHM6Ly93d3cuci1ncmFwaC1nYWxsZXJ5LmNvbS8xOTktY29ycmVsYXRpb24tbWF0cml4LXdpdGgtZ2dhbGx5Lmh0bWwKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJHR2FsbHkiKQoKIyBRdWljayBkaXNwbGF5IG9mIHR3byBjYWJhcGlsaXRpZXMgb2YgR0dhbGx5LCB0byBhc3Nlc3MgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgY29ycmVsYXRpb24gb2YgdmFyaWFibGVzIApsaWJyYXJ5KEdHYWxseSkKIAojIEZyb20gdGhlIGhlbHAgcGFnZToKCiMgZ2dwYWlycyhBRURCLkNFQSwgCiMgICAgICAgICBjb2x1bW5zID0gYygiTUNQMV9yYW5rIiwgIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgVFJBSVRTLkJJTiwgVFJBSVRTLkNPTi5SQU5LKSwgCiMgICAgICAgICBjb2x1bW5MYWJlbHMgPSBjKCJNQ1AxIChwbGFzbWEpIiwgIk1DUDEiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGNpZmljYXRpb24iLCAiQ29sbGFnZW4iLCAiRmF0IDEwJSIsICJJUEgiLCAiTWFjcm9waGFnZXMiLCAiU01DIiwgIlZlc3NlbCBkZW5zaXR5IiksCiMgICAgICAgICBtZXRob2QgPSBjKCJzcGVhcm1hbiIpLAojICAgICAgICAgIyBnZ3Bsb3QyOjphZXMoY29sb3VyID0gR2VuZGVyKSwKIyAgICAgICAgIHByb2dyZXNzID0gRkFMU0UpIAoKZ2dwYWlycyhBRURCLkNFQSwKICAgICAgICBjb2x1bW5zID0gYygiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCBUUkFJVFMuQklOLCBUUkFJVFMuQ09OLlJBTkspLAogICAgICAgIGNvbHVtbkxhYmVscyA9IGMoIk1DUDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGNpZmljYXRpb24iLCAiQ29sbGFnZW4iLCAiRmF0IDEwJSIsICJJUEgiLCAiTWFjcm9waGFnZXMgKGJpbm5lZCkiLCAiU01DIChiaW5uZWQpIiwgIk1hY3JvcGhhZ2VzIiwgIlNNQyIsICJWZXNzZWwgZGVuc2l0eSIpLAogICAgICAgIG1ldGhvZCA9IGMoInNwZWFybWFuIiksCiAgICAgICAgIyBnZ3Bsb3QyOjphZXMoY29sb3VyID0gR2VuZGVyKSwKICAgICAgICBwcm9ncmVzcyA9IEZBTFNFKQoKYGBgCgojIyBDaXJjdWxhdGluZyBNQ1AxCgpGaW5hbGx5LCB3ZSBleHBsb3JlZCBpbiBhIHN1Yi1zYW1wbGUsIHdoZXJlIGNpcmN1bGF0aW5nIE1DUC0xIGxldmVscyBhcmUgYXZhaWxhYmxlLCB0aGUgZm9sbG93aW5nOgoKMS4gQSBjb3JyZWxhdGlvbiBiZXR3ZWVuIE1DUC0xIGxldmVscyBpbiB0aGUgcGxhcXVlIGFuZCBjaXJjdWxhdGluZyBNQ1AtMSBsZXZlbHMKMi4gQXNzb2NpYXRpb25zIG9mIGNpcmN1bGF0aW5nIE1DUC0xIGxldmVscyB3aXRoIHBsYXF1ZSB2dWxuZXJhYmlsaXR5IGNoYXJhY3RlcmlzdGljcwozLiBBc3NvY2lhdGlvbnMgb2YgY2lyY3VsYXRpbmcgTUNQLTEgbGV2ZWxzIHdpdGggdGhlIHN0YXR1cyBvZiB0aGUgcGxhcXVlIGluIHRlcm1zIG9mIHByZXNlbmNlIG9mIHN5bXB0b21zIChzeW1wdG9tYXRpYyB2cy4gYXN5bXB0b21hdGljKQo0LiBBc3NvY2lhdGlvbnMgb2YgY2lyY3VsYXRpbmcgTUNQLTEgbGV2ZWxzIHdpdGggdGhlIHByaW1hcnkgY29tcG9zaXRlIGVuZHBvaW50IG9mIHNlY29uZGFyeSBjYXJkaW92YXNjdWxhciBldmVudHMuCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBsYXNtYSBDb3JyZWxhdGlvbnN9CgojIEluc3RhbGxhdGlvbiBvZiBnZ2NvcnJwbG90KCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppZighcmVxdWlyZShkZXZ0b29scykpIAogIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJrYXNzYW1iYXJhL2dnY29ycnBsb3QiKQoKbGlicmFyeShnZ2NvcnJwbG90KQoKCiMgQ3JlYXRpbmcgbWF0cml4IC0gaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIk1DUDFfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTLkJJTiwgVFJBSVRTLkNPTi5SQU5LLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsICJFUF9tYWpvciIsICJFUF9jb21wb3NpdGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgpBRURCLkNFQS50ZW1wJENhbGNpZmljYXRpb25QbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJENhbGNpZmljYXRpb25QbGFxdWUpCkFFREIuQ0VBLnRlbXAkQ29sbGFnZW5QbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJENvbGxhZ2VuUGxhcXVlKQpBRURCLkNFQS50ZW1wJEZhdDEwUGVyYyA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkRmF0MTBQZXJjKQpBRURCLkNFQS50ZW1wJElQSCA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkSVBIKQpBRURCLkNFQS50ZW1wJFN5bXB0b21zLjVHIDwtIGFzLm51bWVyaWMoQUVEQi5DRUEudGVtcCRTeW1wdG9tcy41RykKQUVEQi5DRUEudGVtcCRBc3ltcHRTeW1wdCA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkQXN5bXB0U3ltcHQpCkFFREIuQ0VBLnRlbXAkRVBfbWFqb3IgPC0gYXMubnVtZXJpYyhBRURCLkNFQS50ZW1wJEVQX21ham9yKQpBRURCLkNFQS50ZW1wJEVQX2NvbXBvc2l0ZSA8LSBhcy5udW1lcmljKEFFREIuQ0VBLnRlbXAkRVBfY29tcG9zaXRlKQojIHN0cihBRURCLkNFQS50ZW1wKQpBRURCLkNFQS5tYXRyaXgucGxhc21hLlJBTksgPC0gYXMubWF0cml4KEFFREIuQ0VBLnRlbXApCnJtKEFFREIuQ0VBLnRlbXApCgpjb3JyX2Jpb21hcmtlcnNfcGxhc21hLnJhbmsgPC0gcm91bmQoY29yKEFFREIuQ0VBLm1hdHJpeC5wbGFzbWEuUkFOSywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIsICN0aGUgY29ycmVsYXRpb24gb3IgY292YXJpYW5jZSBiZXR3ZWVuIGVhY2ggcGFpciBvZiB2YXJpYWJsZXMgaXMgY29tcHV0ZWQgdXNpbmcgYWxsIGNvbXBsZXRlIHBhaXJzIG9mIG9ic2VydmF0aW9ucyBvbiB0aG9zZSB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3BlYXJtYW4iKSwgMykKIyBjb3JyX2Jpb21hcmtlcnMucmFuawoKY29ycl9iaW9tYXJrZXJzX3BsYXNtYV9wLnJhbmsgPC0gZ2djb3JycGxvdDo6Y29yX3BtYXQoQUVEQi5DRUEubWF0cml4LnBsYXNtYS5SQU5LLCB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgbWV0aG9kID0gInNwZWFybWFuIikKCiMgQWRkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgYXJndW1lbnQgbGFiID0gVFJVRQpnZ2NvcnJwbG90KGNvcnJfYmlvbWFya2Vyc19wbGFzbWEucmFuaywgCiAgICAgICAgICAgbWV0aG9kID0gInNxdWFyZSIsIAogICAgICAgICAgIHR5cGUgPSAibG93ZXIiLAogICAgICAgICAgIHRpdGxlID0gIkNyb3NzIGJpb21hcmtlciBjb3JyZWxhdGlvbnMiLCAKICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUsIGxlZ2VuZC50aXRsZSA9IGJxdW90ZSgiU3BlYXJtYW4ncyJ+aXRhbGljKHJobykpLAogICAgICAgICAgIGdndGhlbWUgPSBnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsLCBvdXRsaW5lLmNvbG9yID0gIiNGRkZGRkYiLAogICAgICAgICAgIHNob3cuZGlhZyA9IFRSVUUsCiAgICAgICAgICAgaGMub3JkZXIgPSBGQUxTRSwgCiAgICAgICAgICAgbGFiID0gRkFMU0UsCiAgICAgICAgICAgZGlnaXRzID0gMywKICAgICAgICAgICAjIHAubWF0ID0gY29ycl9iaW9tYXJrZXJzX3BsYXNtYV9wLnJhbmssIHNpZy5sZXZlbCA9IDAuMDUsCiAgICAgICAgICAgY29sb3JzID0gYygiIzEyOTBEOSIsICIjRkZGRkZGIiwgIiNFNTU3MzgiKSkKCgojIGZsYXR0ZW5Db3JyTWF0cml4CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjb3JtYXQgOiBtYXRyaXggb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cwojIHBtYXQgOiBtYXRyaXggb2YgdGhlIGNvcnJlbGF0aW9uIHAtdmFsdWVzCmZsYXR0ZW5Db3JyTWF0cml4IDwtIGZ1bmN0aW9uKGNvcm1hdCwgcG1hdCkgewogIHV0IDwtIHVwcGVyLnRyaShjb3JtYXQpCiAgZGF0YS5mcmFtZSgKICAgIGJpb21hcmtlcl9yb3cgPSByb3duYW1lcyhjb3JtYXQpW3Jvdyhjb3JtYXQpW3V0XV0sCiAgICBiaW9tYXJrZXJfY29sdW1uID0gcm93bmFtZXMoY29ybWF0KVtjb2woY29ybWF0KVt1dF1dLAogICAgc3BlYXJtYW5fY29yICA9KGNvcm1hdClbdXRdLAogICAgcHZhbCA9IHBtYXRbdXRdCiAgICApCn0KCgpjb3JyX2Jpb21hcmtlcnNfcGxhc21hLnJhbmsuZGYgPC0gYXMuZGF0YS50YWJsZShmbGF0dGVuQ29yck1hdHJpeChjb3JyX2Jpb21hcmtlcnNfcGxhc21hLnJhbmssIGNvcnJfYmlvbWFya2Vyc19wbGFzbWFfcC5yYW5rKSkKRFQ6OmRhdGF0YWJsZShjb3JyX2Jpb21hcmtlcnNfcGxhc21hLnJhbmsuZGYpCgojIGNoYXJ0IG9mIGEgY29ycmVsYXRpb24gbWF0cml4CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBBbHRlcm5hdGl2ZSBzb2x1dGlvbiBodHRwczovL3d3dy5yLWdyYXBoLWdhbGxlcnkuY29tLzE5OS1jb3JyZWxhdGlvbi1tYXRyaXgtd2l0aC1nZ2FsbHkuaHRtbAppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIlBlcmZvcm1hbmNlQW5hbHl0aWNzIikKY2hhcnQuQ29ycmVsYXRpb24ubmV3IDwtIGZ1bmN0aW9uIChSLCBoaXN0b2dyYW0gPSBUUlVFLCBtZXRob2QgPSBjKCJwZWFyc29uIiwgImtlbmRhbGwiLCAKICAgICJzcGVhcm1hbiIpLCAuLi4pIAp7CiAgICB4ID0gY2hlY2tEYXRhKFIsIG1ldGhvZCA9ICJtYXRyaXgiKQogICAgaWYgKG1pc3NpbmcobWV0aG9kKSkgCiAgICAgICAgbWV0aG9kID0gbWV0aG9kWzFdCiAgICBjb3JtZXRoIDwtIG1ldGhvZAogICAgcGFuZWwuY29yIDwtIGZ1bmN0aW9uKHgsIHksIGRpZ2l0cyA9IDIsIHByZWZpeCA9ICIiLCB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiwgCiAgICAgICAgbWV0aG9kID0gY29ybWV0aCwgY2V4LmNvciwgLi4uKSB7CiAgICAgICAgdXNyIDwtIHBhcigidXNyIikKICAgICAgICBvbi5leGl0KHBhcih1c3IpKQogICAgICAgIHBhcih1c3IgPSBjKDAsIDEsIDAsIDEpKQogICAgICAgIHIgPC0gY29yKHgsIHksIHVzZSA9IHVzZSwgbWV0aG9kID0gbWV0aG9kKQogICAgICAgIHR4dCA8LSBmb3JtYXQoYyhyLCAwLjEyMzQ1Njc4OSksIGRpZ2l0cyA9IGRpZ2l0cylbMV0KICAgICAgICB0eHQgPC0gcGFzdGUocHJlZml4LCB0eHQsIHNlcCA9ICIiKQogICAgICAgIGlmIChtaXNzaW5nKGNleC5jb3IpKSAKICAgICAgICAgICAgY2V4IDwtIDAuOC9zdHJ3aWR0aCh0eHQpCiAgICAgICAgdGVzdCA8LSBjb3IudGVzdChhcy5udW1lcmljKHgpLCBhcy5udW1lcmljKHkpLCBtZXRob2QgPSBtZXRob2QpCiAgICAgICAgU2lnbmlmIDwtIHN5bW51bSh0ZXN0JHAudmFsdWUsIGNvcnIgPSBGQUxTRSwgbmEgPSBGQUxTRSwgCiAgICAgICAgICAgIGN1dHBvaW50cyA9IGMoMCwgMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSwgMSksIHN5bWJvbHMgPSBjKCIqKioiLCAKICAgICAgICAgICAgICAgICIqKiIsICIqIiwgIi4iLCAiICIpKQogICAgICAgIHRleHQoMC41LCAwLjUsIHR4dCwgY2V4ID0gY2V4ICogKGFicyhyKSArIDAuMykvMS4zKQogICAgICAgIHRleHQoMC44LCAwLjgsIFNpZ25pZiwgY2V4ID0gY2V4LCBjb2wgPSAyKQogICAgfQogICAgZiA8LSBmdW5jdGlvbih0KSB7CiAgICAgICAgZG5vcm0odCwgbWVhbiA9IG1lYW4oeCksIHNkID0gc2QueHRzKHgpKQogICAgfQogICAgZG90YXJncyA8LSBsaXN0KC4uLikKICAgIGRvdGFyZ3MkbWV0aG9kIDwtIE5VTEwKICAgIHJtKG1ldGhvZCkKICAgIGhpc3QucGFuZWwgPSBmdW5jdGlvbih4LCAuLi4gPSBOVUxMKSB7CiAgICAgICAgcGFyKG5ldyA9IFRSVUUpCiAgICAgICAgaGlzdCh4LCBjb2wgPSAiIzEyOTBEOSIsIHByb2JhYmlsaXR5ID0gVFJVRSwgYXhlcyA9IEZBTFNFLCAKICAgICAgICAjIGhpc3QoeCwgY29sID0gImxpZ2h0IGdyYXkiLCBwcm9iYWJpbGl0eSA9IFRSVUUsIGF4ZXMgPSBGQUxTRSwgCiAgICAgICAgICAgIG1haW4gPSAiIiwgYnJlYWtzID0gIkZEIikKICAgICAgICBsaW5lcyhkZW5zaXR5KHgsIG5hLnJtID0gVFJVRSksIGNvbCA9ICIjRTU1NzM4IiwgbHdkID0gMSkKICAgICAgICBydWcoeCkKICAgIH0KICAgIGlmIChoaXN0b2dyYW0pIAogICAgICAgIHBhaXJzKHgsIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gcGFuZWwuc21vb3RoLCB1cHBlci5wYW5lbCA9IHBhbmVsLmNvciwgCiAgICAgICAgICAgIGRpYWcucGFuZWwgPSBoaXN0LnBhbmVsLCAuLi4pCiAgICBlbHNlIHBhaXJzKHgsIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gcGFuZWwuc21vb3RoLCB1cHBlci5wYW5lbCA9IHBhbmVsLmNvciwgLi4uKQp9CgpjaGFydC5Db3JyZWxhdGlvbi5uZXcoQUVEQi5DRUEubWF0cml4LnBsYXNtYS5SQU5LLCBtZXRob2QgPSAic3BlYXJtYW4iLCBoaXN0b2dyYW0gPSBUUlVFLCBwY2ggPSAzKQoKCiMgYWx0ZXJuYXRpdmUgY2hhcnQgb2YgYSBjb3JyZWxhdGlvbiBtYXRyaXgKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEFsdGVybmF0aXZlIHNvbHV0aW9uIGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vMTk5LWNvcnJlbGF0aW9uLW1hdHJpeC13aXRoLWdnYWxseS5odG1sCmluc3RhbGwucGFja2FnZXMuYXV0bygiR0dhbGx5IikKCiMgUXVpY2sgZGlzcGxheSBvZiB0d28gY2FiYXBpbGl0aWVzIG9mIEdHYWxseSwgdG8gYXNzZXNzIHRoZSBkaXN0cmlidXRpb24gYW5kIGNvcnJlbGF0aW9uIG9mIHZhcmlhYmxlcyAKbGlicmFyeShHR2FsbHkpCiAKIyBGcm9tIHRoZSBoZWxwIHBhZ2U6CmdncGFpcnMoQUVEQi5DRUEsCiAgICAgICAgY29sdW1ucyA9IGMoIk1DUDFfcmFuayIsIFRSQUlUUy5CSU4sIFRSQUlUUy5DT04uUkFOSywgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkVQX21ham9yIiwgIkVQX2NvbXBvc2l0ZSIpLCAKICAgICAgICBjb2x1bW5MYWJlbHMgPSBjKCJNQ1AxIChwbGFzbWEpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsY2lmaWNhdGlvbiIsICJDb2xsYWdlbiIsICJGYXQgMTAlIiwgIklQSCIsICJNYWNyb3BoYWdlcyIsICJTTUMiLCAiVmVzc2VsIGRlbnNpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIlN5bXB0b21zIiwgIlN5bXB0b21zIChncm91cGVkKSIsICJNQUNFIiwgIkNvbXBvc2l0ZSIpLAogICAgICAgIG1ldGhvZCA9IGMoInNwZWFybWFuIiksCiAgICAgICAgIyBnZ3Bsb3QyOjphZXMoY29sb3VyID0gR2VuZGVyKSwKICAgICAgICBwcm9ncmVzcyA9IEZBTFNFKSAKYGBgCgojIEFkZGl0aW9uYWwgZmlndXJlcwoKIyMgQWdlIGFuZCBzZXgKV2Ugd2FudCB0byBjcmVhdGUgcGVyLWFnZS1ncm91cCBmaWd1cmVzLiAKCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIE1DUC0xIHBsYXF1ZSBsZXZlbHMgYnkgc2V4IGFuZCBhZ2UgZ3JvdXAgKDw1NSwgNTUtNjQsIDY1LTc0LCA3NS04NCwgODUrKQotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFzbWEgbGV2ZWxzIGJ5IHNleCBhbmQgYWdlIGdyb3VwICg8NTUsIDU1LTY0LCA2NS03NCwgNzUtODQsIDg1KykKLSBTY2F0dGVyIHBsb3Qgb2YgdGhlIGNvcnJlbGF0aW9uIGFuZCByZWdyZXNzaW9uIGxpbmUgYmV0d2VlbiBNQ1AtMSBsZXZlbHMgaW4gcGxhcXVlICh5IGF4aXMpIGFuZCBwbGFzbWEgKHggYXhpcykuCgoKYGBge3IgQWdlR3JvdXBzfQpsaWJyYXJ5KGRwbHlyKQoKQUVEQi5DRUEgPC0gQUVEQi5DRUEgJT4lIG11dGF0ZShBZ2VHcm91cCA9IGZhY3RvcihjYXNlX3doZW4oQWdlIDwgNTUgfiAiPDU1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNTUgICYgQWdlIDw9IDY0IH4gIjU1LTY0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNjUgICYgQWdlIDw9IDc0IH4gIjY1LTc0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNzUgICYgQWdlIDw9IDg0IH4gIjc1LTg0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgfiAiODUrIikpKSAKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JSBtdXRhdGUoQWdlR3JvdXBTZXggPSBmYWN0b3IoY2FzZV93aGVuKEFnZSA8IDU1ICYgR2VuZGVyID09ICJtYWxlIiB+ICI8NTUgbWFsZXMiICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNTUgICYgQWdlIDw9IDY0ICYgR2VuZGVyID09ICJtYWxlIn4gIjU1LTY0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNjUgICYgQWdlIDw9IDc0ICYgR2VuZGVyID09ICJtYWxlIn4gIjY1LTc0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gNzUgICYgQWdlIDw9IDg0ICYgR2VuZGVyID09ICJtYWxlIn4gIjc1LTg0IG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgJiBHZW5kZXIgPT0gIm1hbGUifiAiODUrIG1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPCA1NSAmIEdlbmRlciA9PSAiZmVtYWxlIiB+ICI8NTUgZmVtYWxlcyIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA+PSA1NSAgJiBBZ2UgPD0gNjQgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI1NS02NCBmZW1hbGVzICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlID49IDY1ICAmIEFnZSA8PSA3NCAmIEdlbmRlciA9PSAiZmVtYWxlIn4gIjY1LTc0IGZlbWFsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA+PSA3NSAgJiBBZ2UgPD0gODQgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI3NS04NCBmZW1hbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2UgPj0gODUgJiBHZW5kZXIgPT0gImZlbWFsZSJ+ICI4NSsgZmVtYWxlcyIpKSkKCnRhYmxlKEFFREIuQ0VBJEFnZUdyb3VwLCBBRURCLkNFQSRHZW5kZXIpCnRhYmxlKEFFREIuQ0VBJEFnZUdyb3VwU2V4KQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscyBwZXIgc2V4IGFuZCBhZ2UgZ3JvdXAuCgojIyMgSW52ZXJzZS1yYW5rIHRyYW5zZm9ybWVkIGRhdGEKCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgpgYGB7ciBNQ1AxIHBlciBBZ2VHcm91cCBwZXIgU2V4LCByYW5rZWR9CgojID9nZ3B1YnI6OmdnYm94cGxvdCgpCgojIEdsb2JhbCB0ZXN0CiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEdlbmRlciwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKYGBgCgojIyMjIE1DUDEgcGxhc21hIGxldmVscwoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgTUNQMSBwZXIgQWdlR3JvdXAgcGVyIFNleCwgcmFua2VkIHBsYXNtYX0KIyBjb21wYXJlX21lYW5zKE1DUDFfcmFuayB+IEdlbmRlciwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsCiAgICAgICAgICAgICAgICAgIHggPSBjKCJHZW5kZXIiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3JhbmsiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwKICAgICAgICAgICAgICAgICAgeCA9IGMoIkFnZUdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJBZ2UgZ3JvdXBzICh5ZWFycykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQoKYGBgCgojIyMgUmF3IGRhdGEKClNpbWFsYXJseSBidXQgbm93IGZvciB0aGUgcmF3IGRhdGEgYXMgbWVkaWFuIMKxIGludGVycXVhcnRpbGUgcmFuZ2UuCgojIyMjIE1DUDEgcGxhcXVlIGxldmVscwoKCmBgYHtyIE1DUDEgcGVyIEFnZUdyb3VwIHBlciBTZXh9CgojID9nZ3B1YnI6OmdnYm94cGxvdCgpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgIyBhZGQgPSAibWVkaWFuX2lxciIpCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpCgpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWRpYW5faXFyIikKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkKYGBgCgojIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBBZ2VHcm91cCBwZXIgU2V4LCBwbGFzbWF9CmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQpgYGAKCgojIyBIeXBlcnRlbnNpb24gJiBibG9vZCBwcmVzc3VyZQpXZSB3YW50IHRvIGNyZWF0ZSBmaWd1cmVzIG9mIE1DUDEgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgaHlwZXJ0ZW5zaW9uL2Jsb29kIHByZXNzdXJlLCBhbmQgdXNlIG9mIGFudGktaHlwZXJ0ZW5zaXZlIGRydWdzLiAKCi0gQm94IGFuZCBXaGlza2VyIHBsb3QgZm9yIE1DUC0xIHBsYXF1ZSBsZXZlbHMgYnkgaHlwZXJ0ZW5zaW9uIGdyb3VwIChubywgeWVzKQotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFzbWEgbGV2ZWxzIGJ5IHN5c3RvbGljIGJsb29kIHByZXNzdXJlIGdyb3VwICg8MTIwLCAxMjAtMTM5LCAxNDAtMTU5LDE2MCspCgoKYGBge3IgQmxvb2RQcmVzc3VyZX0KbGlicmFyeShkcGx5cikKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JSBtdXRhdGUoU0JQR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKHN5c3RvbGljIDwgMTIwIH4gIjwxMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RvbGljID49IDEyMCAgJiBzeXN0b2xpYyA8PSAxMzkgfiAiMTIwLTEzOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdG9saWMgPj0gMTQwICAmIHN5c3RvbGljIDw9IDE1OSB+ICIxNDAtMTU5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0b2xpYyA+PSAxNjAgfiAiMTYwKyIpKSkgCgp0YWJsZShBRURCLkNFQSRTQlBHcm91cCwgQUVEQi5DRUEkR2VuZGVyKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscyBwZXIgc2V4IGFuZCBoeXBlcnRlbnNpb24vYmxvb2QgcHJlc3N1cmUgZ3JvdXAuCgojIyMgSW52ZXJzZS1yYW5rIHRyYW5zZm9ybWVkIGRhdGEKCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgpgYGB7ciBNQ1AxIHBlciBCbG9vZFByZXNzdXJlIHBlciBTZXgsIHJhbmtlZH0KCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoU0JQR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTQlBHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU2VsZi1yZXBvcnRlZCBoeXBlcnRlbnNpb24gcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCkgJiAhaXMubmEoSHlwZXJ0ZW5zaW9uLmRydWdzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNlbGYtcmVwb3J0ZWQgaHlwZXJ0ZW5zaW9uIHBlciBtZWRpY2F0aW9uIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJIeXBlcnRlbnNpb24uZHJ1Z3MiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzQ5QTAxRCIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQoKCgpgYGAKCiMjIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBCbG9vZFByZXNzdXJlIHBlciBTZXgsIHJhbmtlZCBwbGFzbWF9CgpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNCUEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAKCmBgYAoKIyMjIFJhdyBkYXRhCgpTaW1hbGFybHkgYnV0IG5vdyBmb3IgdGhlIHJhdyBkYXRhIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCgpgYGB7ciBNQ1AxIHBlciBCbG9vZFByZXNzdXJlIHBlciBTZXh9CgpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShTQlBHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNCUEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNlbGYtcmVwb3J0ZWQgaHlwZXJ0ZW5zaW9uIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQpICYgIWlzLm5hKEh5cGVydGVuc2lvbi5kcnVncykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTZWxmLXJlcG9ydGVkIGh5cGVydGVuc2lvbiBwZXIgbWVkaWNhdGlvbiB1c2UiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiM0OUEwMUQiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgCmBgYAoKIyMjIE1DUDEgcGxhc21hIGxldmVscwoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgTUNQMSBwZXIgQmxvb2RQcmVzc3VyZSBwZXIgU2V4LCBwbGFzbWF9CgpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTQlBHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgIyBhZGQgPSAibWVkaWFuX2lxciIpCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpCmBgYAoKCiMjIEh5cGVyY2hvbGVzdGVyb2xlbWlhICYgTERMIGxldmVscwpXZSB3YW50IHRvIGNyZWF0ZSBmaWd1cmVzIG9mIE1DUDEgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgaHlwZXJjaG9sZXN0ZXJvbGVtaWEvTERMLWxldmVscywgYW5kIHVzZSBvZiBsaXBpZC1sb3dlcmluZyBkcnVncy4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFxdWUgbGV2ZWxzIGJ5IGh5cGVyY2hvbGVzdGVyb2xlbWlhIGdyb3VwIChubywgeWVzKQotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFzbWEgbGV2ZWxzIGJ5IExETC1sZXZlbHMgKG1tb2wvTCkgZ3JvdXAgKDwxMDAsIDEwMC0xMjksIDEzMC0xNTksIDE2MC0xODksIDE5MCspCgpgYGB7ciBIeXBlcmNob2xlc3Rlcm9sZW1pYX0KbGlicmFyeShkcGx5cikKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JSBtdXRhdGUoTERMR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKExETF9maW5hbENVIDwgMTAwIH4gIjwxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExETF9maW5hbENVID49IDEwMCAgJiBMRExfZmluYWxDVSA8PSAxMjkgfiAiMTAwLTEyOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERMX2ZpbmFsQ1UgPj0gMTMwICAmIExETF9maW5hbENVIDw9IDE1OSB+ICIxMzAtMTU5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRExfZmluYWxDVSA+PSAxNjAgICYgTERMX2ZpbmFsQ1UgPD0gMTg5IH4gIjE2MC0xODkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExETF9maW5hbENVID49IDE5MCB+ICIxOTArIikpKSAKCgp0YWJsZShBRURCLkNFQSRMRExHcm91cCwgQUVEQi5DRUEkR2VuZGVyKQoKCmBgYAoKTm93IHdlIGNhbiBkcmF3IHNvbWUgZ3JhcGhzIG9mIHBsYXNtYS9wbGFxdWUgTUNQMSBsZXZlbHMgcGVyIHNleCBhbmQgaHlwZXJjaG9sZXN0ZXJvbGVtaWEvTERMLWxldmVscyBncm91cCwgYXMgd2VsbCBhcyBzdHJhdGlmaWVkIGJ5IGxpcGlkLWxvd2VyaW5nIGRydWdzIHVzZXJzLgoKIyMjIEludmVyc2UtcmFuayB0cmFuc2Zvcm1lZCBkYXRhCgojIyMjIE1DUDEgcGxhcXVlIGxldmVscwoKYGBge3IgTUNQMSBwZXIgSHlwZXJjaG9sZXN0ZXJvbGVtaWEgcGVyIFNleCwgcmFua2VkfQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShMRExHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkxETEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJMREwgKG1nL2RMKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKExETEdyb3VwKSAmICFpcy5uYShNZWQuU3RhdGluLkxMRCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkxETEdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJMREwgKG1nL2RMKSBwZXIgTExEIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJNZWQuU3RhdGluLkxMRCIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjNDlBMDFEIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgpgYGAKCiMjIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBIeXBlcmNob2xlc3Rlcm9sZW1pYSBwZXIgU2V4LCByYW5rZWQgcGxhc21hfQojIGNvbXBhcmVfbWVhbnMoTUNQMV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3JhbmsiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgpgYGAKCiMjIyBSYXcgZGF0YQoKU2ltYWxhcmx5IGJ1dCBub3cgZm9yIHRoZSByYXcgZGF0YSBhcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4KCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgoKYGBge3IgTUNQMSBwZXIgSHlwZXJjaG9sZXN0ZXJvbGVtaWEgcGVyIFNleH0KCiMgP2dncHVicjo6Z2dib3hwbG90KCkKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoTERMR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJMRExHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkxETCAobWcvZEwpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoTERMR3JvdXApICYgIWlzLm5hKE1lZC5TdGF0aW4uTExEKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiTERMR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTUiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJMREwgKG1nL2RMKSBwZXIgTExEIHVzZSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIk1lZC5TdGF0aW4uTExEIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWRpYW5faXFyIikKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkKYGBgCgojIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBIeXBlcmNob2xlc3Rlcm9sZW1pYSBwZXIgU2V4LCBwbGFzbWF9CmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQpgYGAKCgojIyBLaWRuZXkgZnVuY3Rpb24gKGVHRlIpCldlIHdhbnQgdG8gY3JlYXRlIGZpZ3VyZXMgb2YgTUNQMSBsZXZlbHMgc3RyYXRpZmllZCBieSBraWRuZXkgZnVuY3Rpb24uIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgTUNQLTEgcGxhcXVlIGxldmVscyBieSBjaHJvbmljIGtpZG5leSBkaXNlYXNlIChDS0QpIGdyb3VwICgxLCAyLCAzLCA0LCA1KQotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFzbWEgbGV2ZWxzIGJ5IGVHRlIgKE1EUkQtYmFzZWQpIGdyb3VwICg5MCssIDYwLTg5LCAzMC01OSwgPDMwKQoKYGBge3IgRUdGUn0KbGlicmFyeShkcGx5cikKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JSBtdXRhdGUoZUdGUkdyb3VwID0gZmFjdG9yKGNhc2Vfd2hlbihHRlJfTURSRCA8IDE1IH4gIjwxNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlJfTURSRCA+PSAxNSAgJiBHRlJfTURSRCA8PSAyOSB+ICIxNS0yOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlJfTURSRCA+PSAzMCAgJiBHRlJfTURSRCA8PSA1OSB+ICIzMC01OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlJfTURSRCA+PSA2MCAgJiBHRlJfTURSRCA8PSA4OSB+ICI2MC04OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlJfTURSRCA+PSA5MCB+ICI5MCsiKSkpCgp0YWJsZShBRURCLkNFQSRlR0ZSR3JvdXAsIEFFREIuQ0VBJEdlbmRlcikKCnRhYmxlKEFFREIuQ0VBJGVHRlJHcm91cCwgQUVEQi5DRUEkS0RPUUkpCgpgYGAKCk5vdyB3ZSBjYW4gZHJhdyBzb21lIGdyYXBocyBvZiBwbGFzbWEvcGxhcXVlIE1DUDEgbGV2ZWxzIHBlciBzZXggYW5kIGtpZG5leSBmdW5jdGlvbiBncm91cC4KCiMjIyBJbnZlcnNlLXJhbmsgdHJhbnNmb3JtZWQgZGF0YQoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCmBgYHtyIE1DUDEgcGVyIEVHRlIgcGVyIFNleCwgcmFua2VkfQoKIyBHbG9iYWwgdGVzdAojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoImVHRlJHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZUdGUiAobUwvbWluIHBlciAxLjczIG0yKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoS0RPUUkpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJLRE9RSSIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiS2lkbmV5IGZ1bmN0aW9uIChLRE9RSSkgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSArIHJvdGF0ZV94X3RleHQoNDUpLCBsZWdlbmQgPSAicmlnaHQiKSAKcm0ocDEpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKGVHRlJHcm91cCkgJiAhaXMubmEoS0RPUUkpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJlR0ZSR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gImVHRlIgKG1ML21pbiBwZXIgMS43MyBtMikgYnkgS0RPUUkgZ3JvdXAiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiS0RPUUkiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gInJpZ2h0IikKcm0ocDEpCgpgYGAKCiMjIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBFR0ZSIHBlciBTZXgsIHJhbmtlZCBwbGFzbWF9CiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCmBgYAoKIyMjIFJhdyBkYXRhCgpTaW1hbGFybHkgYnV0IG5vdyBmb3IgdGhlIHJhdyBkYXRhIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCgpgYGB7ciBNQ1AxIHBlciBFR0ZSIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEdlbmRlciwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiZUdGUkdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiZUdGUiAobUwvbWluIHBlciAxLjczIG0yKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShLRE9RSSkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIktET1FJIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiS2lkbmV5IGZ1bmN0aW9uIChLRE9RSSkgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxICsgcm90YXRlX3hfdGV4dCg0NSksIGxlZ2VuZCA9ICJyaWdodCIpIApybShwMSkKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoZUdGUkdyb3VwKSAmICFpcy5uYShLRE9RSSkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoImVHRlJHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gImVHRlIgKG1ML21pbiBwZXIgMS43MyBtMikgYnkgS0RPUUkgZ3JvdXAiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJLRE9RSSIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAicmlnaHQiKQpybShwMSkKCmBgYAoKIyMjIE1DUDEgcGxhc21hIGxldmVscwoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgTUNQMSBwZXIgRUdGUiBwZXIgU2V4LCBwbGFzbWF9CmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQpgYGAKCgojIyBCTUkKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiBNQ1AxIGxldmVscyBzdHJhdGlmaWVkIGJ5IEJNSS4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFxdWUgbGV2ZWxzIGJ5IEJNSSBXSE8gZ3JvdXAgKHVuZGVyd2VpZ2h0LCBub3JtYWwsIG92ZXJ3ZWlnaHQsIG9iZXNlKQotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFzbWEgbGV2ZWxzIGJ5IEJNSSBncm91cCAoPDE4LjUsIDE4LjUtMjQuOSwgMjUsIDI5LjksIDMwLTI0LjksIDM1KykKCmBgYHtyIEJNSX0KbGlicmFyeShkcGx5cikKCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JSBtdXRhdGUoQk1JR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKEJNSSA8IDE4LjUgfiAiPDE4LjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNSSA+PSAxOC41ICAmIEJNSSA8IDI1IH4gIjE4LjUtMjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJNSSA+PSAyNSAgJiBCTUkgPCAzMCB+ICIyNS0yOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk1JID49IDMwICAmIEJNSSA8IDM1IH4gIjMwLTM1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTUkgPj0gMzUgfiAiMzUrIikpKSAKCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLkNFQSRCTUlfVVMgPC0gYXNfZmFjdG9yKEFFREIuQ0VBJEJNSV9VUykKIyBBRURCLkNFQSRCTUlfV0hPIDwtIGFzX2ZhY3RvcihBRURCLkNFQSRCTUlfV0hPKQojIHRhYmxlKEFFREIuQ0VBJEJNSV9XSE8sIEFFREIuQ0VBJEJNSV9VUykKCnRhYmxlKEFFREIuQ0VBJEJNSUdyb3VwLCBBRURCLkNFQSRHZW5kZXIpCnRhYmxlKEFFREIuQ0VBJEJNSUdyb3VwLCBBRURCLkNFQSRCTUlfV0hPKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscyBwZXIgc2V4IGFuZCBhZ2UgZ3JvdXAuCgojIyMgSW52ZXJzZS1yYW5rIHRyYW5zZm9ybWVkIGRhdGEKCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgpgYGB7ciBNQ1AxIHBlciBCTUkgcGVyIFNleCwgcmFua2VkfQoKIyBHbG9iYWwgdGVzdAojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkJNSSBncm91cHMgKGtnL20yKSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICAjIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMTI5MEQ5IiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEdlbmRlciwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoQk1JR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJCTUlHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQk1JIGdyb3VwcyAoa2cvbTIpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTVfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKcDEgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEgJT4lIGZpbHRlcighaXMubmEoQk1JR3JvdXApICYgIWlzLm5hKEJNSV9XSE8pKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQk1JIGdyb3VwcyAoa2cvbTIpIHBlciBXSE8gY2F0ZWdvcmllcyIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJCTUlfV0hPIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJyaWdodCIpCnJtKHAxKQoKYGBgCgojIyMjIE1DUDEgcGxhc21hIGxldmVscwoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgTUNQMSBwZXIgQk1JIHBlciBTZXgsIHJhbmtlZCBwbGFzbWF9CiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCmBgYAoKIyMjIFJhdyBkYXRhCgpTaW1hbGFybHkgYnV0IG5vdyBmb3IgdGhlIHJhdyBkYXRhIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCgpgYGB7ciBNQ1AxIHBlciBCTUkgcGVyIFNleH0KCiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShCTUlHcm91cCkpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkJNSUdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQk1JIGdyb3VwcyAoa2cvbTIpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQk1JR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTUiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJCTUkgZ3JvdXBzIChrZy9tMikiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKEJNSUdyb3VwKSAmICFpcy5uYShCTUlfV0hPKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTUiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJCTUkgZ3JvdXBzIChrZy9tMikgcGVyIFdITyBjYXRlZ29yaWVzIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAibnBnIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncGFyKHAxLCBsZWdlbmQgPSAicmlnaHQiKQpybShwMSkKYGBgCgojIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBCTUkgcGVyIFNleCwgcGxhc21hfQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJHZW5kZXIiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWRpYW5faXFyIikKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkKCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkFnZUdyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICAjIGFkZCA9ICJtZWRpYW5faXFyIikKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkKYGBgCgoKIyMgRGlhYmV0ZXMKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiBNQ1AxIGxldmVscyBzdHJhdGlmaWVkIGJ5IHR5cGUgMiBkaWFiZXRlcy4gCgotIEJveCBhbmQgV2hpc2tlciBwbG90IGZvciBNQ1AtMSBwbGFxdWUgbGV2ZWxzIGJ5IHR5cGUgMiBkaWFiZXRlcyBncm91cCAobm8sIHllcykKCk5vdyB3ZSBjYW4gZHJhdyBzb21lIGdyYXBocyBvZiBwbGFzbWEvcGxhcXVlIE1DUDEgbGV2ZWxzIHBlciBzZXggYW5kIGFnZSBncm91cC4KCiMjIyBJbnZlcnNlLXJhbmsgdHJhbnNmb3JtZWQgZGF0YQoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCmBgYHtyIE1DUDEgcGVyIERpYWJldGVzIHBlciBTZXgsIHJhbmtlZH0KCiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkRpYWJldGVzU3RhdHVzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKERpYWJldGVzU3RhdHVzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiRGlhYmV0ZXNTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkRpYWJldGVzIHN0YXR1cyBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCmBgYAoKIyMjIyBNQ1AxIHBsYXNtYSBsZXZlbHMKCj4gTk9UIEFWQUlMQUJMRSBZRVQKCmBgYHtyIE1DUDEgcGVyIERpYWJldGVzIHBlciBTZXgsIHJhbmtlZCBwbGFzbWF9CiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCmBgYAoKIyMjIFJhdyBkYXRhCgpTaW1hbGFybHkgYnV0IG5vdyBmb3IgdGhlIHJhdyBkYXRhIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCgpgYGB7ciBNQ1AxIHBlciBEaWFiZXRlcyBwZXIgU2V4fQoKIyBHbG9iYWwgdGVzdAojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1IH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShEaWFiZXRlc1N0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkRpYWJldGVzU3RhdHVzIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiRGlhYmV0ZXMgc3RhdHVzIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTUgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKERpYWJldGVzU3RhdHVzKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiRGlhYmV0ZXNTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTUiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJEaWFiZXRlcyBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCgpgYGAKCiMjIyBNQ1AxIHBsYXNtYSBsZXZlbHMKCj4gTk9UIEFWQUlMQUJMRSBZRVQKCmBgYHtyIE1DUDEgcGVyIERpYWJldGVzIHBlciBTZXgsIHBsYXNtYX0KZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgIyBhZGQgPSAibWVkaWFuX2lxciIpCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpCgpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJBZ2UgZ3JvdXBzICh5ZWFycykgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgIyBhZGQgPSAibWVkaWFuX2lxciIpCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpCmBgYAoKCiMjIFNtb2tpbmcKV2Ugd2FudCB0byBjcmVhdGUgZmlndXJlcyBvZiBNQ1AxIGxldmVscyBzdHJhdGlmaWVkIGJ5IHNtb2tpbmcuIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgTUNQLTEgcGxhcXVlIGxldmVscyBieSBzbW9raW5nIGdyb3VwIChuZXZlciwgZXgsIGN1cnJlbnQpCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscyBwZXIgc2V4IGFuZCBhZ2UgZ3JvdXAuCgojIyMgSW52ZXJzZS1yYW5rIHRyYW5zZm9ybWVkIGRhdGEKCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgpgYGB7ciBNQ1AxIHBlciBTbW9raW5nIHBlciBTZXgsIHJhbmtlZH0KCiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTbW9rZXJTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNtb2tlciBzdGF0dXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsIAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShTbW9rZXJTdGF0dXMpKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTbW9rZXJTdGF0dXMiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNtb2tlciBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpgYGAKCiMjIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBTbW9raW5nIHBlciBTZXgsIHJhbmtlZCBwbGFzbWF9CiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiR2VuZGVyIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcmFuayB+IEFnZUdyb3VwLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsCiAgICAgICAgICAgICAgICAgIHggPSBjKCJBZ2VHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF1cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCmBgYAoKIyMjIFJhdyBkYXRhCgpTaW1hbGFybHkgYnV0IG5vdyBmb3IgdGhlIHJhdyBkYXRhIGFzIG1lZGlhbiDCsSBpbnRlcnF1YXJ0aWxlIHJhbmdlLgoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCgpgYGB7ciBNQ1AxIHBlciBTbW9raW5nIHBlciBTZXh9CgojIEdsb2JhbCB0ZXN0CiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTUgfiBHZW5kZXIsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKFNtb2tlclN0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNtb2tlclN0YXR1cyIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNtb2tlciBzdGF0dXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z10iLAogICAgICAgICAgICAgICAgICAjIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICMgcGFsZXR0ZSA9IGMoIiNENTI2N0IiLCAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMTI5MEQ5IiwgCiAgICAgICAgICAgICAgICAgIGFkZCA9IGMoIm1lZGlhbl9pcXIiLCAiaml0dGVyIikpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3BnX3VnXzIwMTUgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKFNtb2tlclN0YXR1cykpLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIlNtb2tlclN0YXR1cyIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlNtb2tlciBzdGF0dXMgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gYygibWVkaWFuX2lxciIsICJqaXR0ZXIiKSkgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKCmBgYAoKIyMjIE1DUDEgcGxhc21hIGxldmVscwoKPiBOT1QgQVZBSUxBQkxFIFlFVAoKYGBge3IgTUNQMSBwZXIgU21va2luZyBwZXIgU2V4LCBwbGFzbWF9CmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQpgYGAKCgojIyBTdGVub3NpcwpXZSB3YW50IHRvIGNyZWF0ZSBmaWd1cmVzIG9mIE1DUDEgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgc3Rlbm9zaXMgZ3JhZGUuIAoKLSBCb3ggYW5kIFdoaXNrZXIgcGxvdCBmb3IgTUNQLTEgcGxhcXVlIGxldmVscyBieSBzdGVub3NpcyBncmFkZSBncm91cCAoPDcwLCA3MC04OSwgOTArKQoKYGBge3IgU3Rlbm9zaXN9CmxpYnJhcnkoZHBseXIpCgpBRURCLkNFQSA8LSBBRURCLkNFQSAlPiUgbXV0YXRlKFN0ZW5vdGljR3JvdXAgPSBmYWN0b3IoY2FzZV93aGVuKHN0ZW5vc2UgPT0gIjAtNDklIiB+ICI8NzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjAtNDklIiB+ICI8NzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjUwLTcwJSIgfiAiPDcwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVub3NlID09ICI3MC05MCUiIH4gIjcwLTg5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVub3NlID09ICI1MC05OSUiIH4gIjkwKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rlbm9zZSA9PSAiNzAtOTklIiB+ICI5MCsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5vc2UgPT0gIjEwMCUgKE9jY2x1c2lvbikiIH4gIjkwKyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rlbm9zZSA9PSAiOTAtOTklIiB+ICI5MCsiKSkpCgp0YWJsZShBRURCLkNFQSRTdGVub3RpY0dyb3VwLCBBRURCLkNFQSRHZW5kZXIpCnRhYmxlKEFFREIuQ0VBJHN0ZW5vc2UsIEFFREIuQ0VBJFN0ZW5vdGljR3JvdXApCgpgYGAKCk5vdyB3ZSBjYW4gZHJhdyBzb21lIGdyYXBocyBvZiBwbGFzbWEvcGxhcXVlIE1DUDEgbGV2ZWxzIHBlciBzZXggYW5kIGFnZSBncm91cC4KCiMjIyBJbnZlcnNlLXJhbmsgdHJhbnNmb3JtZWQgZGF0YQoKIyMjIyBNQ1AxIHBsYXF1ZSBsZXZlbHMKCmBgYHtyIE1DUDEgcGVyIFN0ZW5vc2lzIHBlciBTZXgsIHJhbmtlZH0KCiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShTdGVub3RpY0dyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiU3Rlbm90aWNHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3Rlbm90aWMgZ3JhZGUiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24pIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKFN0ZW5vdGljR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTdGVub3RpY0dyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTdGVub3RpYyBncmFkZSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgpgYGAKCiMjIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBTdGVub3NpcyBwZXIgU2V4LCByYW5rZWQgcGxhc21hfQojIGNvbXBhcmVfbWVhbnMoTUNQMV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKCiMgY29tcGFyZV9tZWFucyhNQ1AxX3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3JhbmsiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIkFnZSBncm91cHMgKHllYXJzKSBwZXIgZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgpgYGAKCiMjIyBSYXcgZGF0YQoKU2ltYWxhcmx5IGJ1dCBub3cgZm9yIHRoZSByYXcgZGF0YSBhcyBtZWRpYW4gwrEgaW50ZXJxdWFydGlsZSByYW5nZS4KCiMjIyMgTUNQMSBwbGFxdWUgbGV2ZWxzCgoKYGBge3IgTUNQMSBwZXIgU3Rlbm9zaXMgcGVyIFNleH0KCiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSAlPiUgZmlsdGVyKCFpcy5uYShTdGVub3RpY0dyb3VwKSksIAogICAgICAgICAgICAgICAgICB4ID0gYygiU3Rlbm90aWNHcm91cCIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNSIsIAogICAgICAgICAgICAgICAgICB4bGFiID0gIlN0ZW5vdGljIGdyYWRlIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAjIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBICU+JSBmaWx0ZXIoIWlzLm5hKFN0ZW5vdGljR3JvdXApKSwgCiAgICAgICAgICAgICAgICAgIHggPSBjKCJTdGVub3RpY0dyb3VwIiksCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1IiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3Rlbm90aWMgZ3JhZGUgcGVyIGdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjRDUyNjdCIiwgIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gImtydXNrYWwudGVzdCIpCgoKYGBgCgojIyMgTUNQMSBwbGFzbWEgbGV2ZWxzCgo+IE5PVCBBVkFJTEFCTEUgWUVUCgpgYGB7ciBNQ1AxIHBlciBTdGVub3NpcyBwZXIgU2V4LCBwbGFzbWF9CmdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9IGMoIkdlbmRlciIpLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQoKZ2dwdWJyOjpnZ2JveHBsb3QoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gYygiQWdlR3JvdXAiKSwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiQWdlIGdyb3VwcyAoeWVhcnMpIHBlciBnZW5kZXIiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhc21hIFtwZy9tTF0iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiI0Q1MjY3QiIsICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgICMgYWRkID0gIm1lZGlhbl9pcXIiKQogICAgICAgICAgICAgICAgICBhZGQgPSBjKCJtZWRpYW5faXFyIiwgImppdHRlciIpKQpgYGAKCgoKIyMgQ2lyY3VsYXRpbmcgdnMuIHBsYXF1ZSBNQ1AxIGxldmVscwoKV2Ugd2lsbCBhbHNvIG1ha2UgYSBuaWNlIGNvcnJlbGF0aW9uIHBsb3QgYmV0d2VlbiBwbGFzbWEgYW5kIHBsYXF1ZSBNQ1AxIGxldmVscy4KCj4gTk9UIEFWQUlMQUJMRSBZRVQKCmBgYHtyIE1DUDEgY29ycmVsYXRpb25zLCBwbGFzbWEgdnMuIHBsYXF1ZX0KCmdncHVicjo6Z2dzY2F0dGVyKEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJNQ1AxX3BnX3VnXzIwMTUiLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXNtYSBbcGcvbUxdIiwKICAgICAgICAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgYWRkLnBhcmFtcyA9IGxpc3QoY29sb3IgPSAiIzEyOTBEOSIpLAogICAgICAgICAgICAgICAgICBjb25mLmludCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLmNvZWZmLmFyZ3MgPSBsaXN0KG1ldGhvZCA9ICJzcGVhcm1hbiIpLCBjb3IuY29lZi5jb29yZCA9IGMoOCw3NTApKQoKZ2dwdWJyOjpnZ3NjYXR0ZXIoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddXG4oaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uKSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXVxuKGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbikiLAogICAgICAgICAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICIjMTI5MEQ5IiksCiAgICAgICAgICAgICAgICAgIGNvbmYuaW50ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IuY29lZmYuYXJncyA9IGxpc3QobWV0aG9kID0gInNwZWFybWFuIiksIGNvci5jb2VmLmNvb3JkID0gYygyLDMpKQoKYGBgCgojIyBQbGFxdWUgdnMuIHBsYXF1ZSBNQ1AxIGxldmVscwpXZSB3aWxsIGFsc28gbWFrZSBhIG5pY2UgY29ycmVsYXRpb24gcGxvdCBiZXR3ZWVuIHRoZSB0d28gZXhwZXJpbWVudHMgb2YgcGxhcXVlIE1DUDEgbGV2ZWxzLiAKCmBgYHtyIE1DUDEgY29ycmVsYXRpb25zLCBwbGFxdWUgdnMuIHBsYXF1ZX0KQUVEQi5DRUEkTUNQMV9yYW5rIDwtIHFub3JtKChyYW5rKEFFREIuQ0VBJE1DUDEsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQi5DRUEkTUNQMSkpKQpzdW1tYXJ5KEFFREIuQ0VBJE1DUDEpCnN1bW1hcnkoQUVEQi5DRUEkTUNQMV9wZ191Z18yMDE1KQoKZ2dwdWJyOjpnZ3NjYXR0ZXIoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICB4ID0gIk1DUDEiLCAKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTUiLAogICAgICAgICAgICAgICAgICB4bGFiID0gIk1DUDEgcGxhcXVlIFtwZy9tTF0gKGV4cC4gbm8uIDEpIiwKICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNQ1AxIHBsYXF1ZSBbcGcvdWddIChleHAuIG5vLiAyKSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFLAogICAgICAgICAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5jb2VmZi5hcmdzID0gbGlzdChtZXRob2QgPSAic3BlYXJtYW4iKSkKCmdncHVicjo6Z2dzY2F0dGVyKEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJNQ1AxX3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL21MXVxuKElOUlQsICBleHAuIG5vLiAxKSIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKElOUlQsICBleHAuIG5vLiAyKSIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gIiMxMjkwRDkiKSwKICAgICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFLAogICAgICAgICAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5jb2VmZi5hcmdzID0gbGlzdChtZXRob2QgPSAic3BlYXJtYW4iKSkKCmBgYAoKCiMjIFN5bXB0b21zCldlIHdhbnQgdG8gY3JlYXRlIHBlci1zeW1wdG9tIGZpZ3VyZXMuIAoKCmBgYHtyIFN5bXB0b21Hcm91cHN9CmxpYnJhcnkoZHBseXIpCgp0YWJsZShBRURCLkNFQSRBZ2VHcm91cCwgQUVEQi5DRUEkQXN5bXB0U3ltcHQyRykKdGFibGUoQUVEQi5DRUEkR2VuZGVyLCBBRURCLkNFQSRBc3ltcHRTeW1wdDJHKQp0YWJsZShBRURCLkNFQSRBc3ltcHRTeW1wdDJHKQoKYGBgCgpOb3cgd2UgY2FuIGRyYXcgc29tZSBncmFwaHMgb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscyBwZXIgc3ltcHRvbSBncm91cC4KYGBge3IgTUNQMSBwZXIgU3ltcHRvbUdyb3Vwc30KCiMgP2dncHVicjo6Z2dib3hwbG90KCkKbXlfY29tcGFyaXNvbnMgPC0gbGlzdChjKCJBc3ltcHRvbWF0aWMiLCAiU3ltcHRvbWF0aWMiKSkKCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJBc3ltcHRTeW1wdDJHIiwgeSA9ICJNQ1AxX3BnX3VnXzIwMTVfcmFuayIsCiAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1DUDEgcGxhcXVlIFtwZy91Z10gbGV2ZWxzIHBlciBzeW1wdG9tIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiU3ltcHRvbXMiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbiBpbnZlcnNlLXJhbmsgdHJhbnNmb3JtYXRpb24iLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJBc3ltcHRTeW1wdDJHIiwgCiAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKHVpdGhvZl9jb2xvclsxNl0sIHVpdGhvZl9jb2xvclsyM10pLAogICAgICAgICAgICAgICAgICBhZGQgPSAiZG90cGxvdCIsICMgQWRkIGRvdHBsb3QKICAgICAgICAgICAgICAgICAgYWRkLnBhcmFtcyA9IGxpc3QoYmlud2lkdGggPSAwLjEsIGRvdHNpemUgPSAwLjMpCiAgICAgICAgICApICsKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9IGMoInJpZ2h0IiksIGxlZ2VuZC50aXRsZSA9ICJTeW1wdG9tcyIpCmBgYAoKYGBge3IgTUNQMSBwZXIgU3ltcHRvbUdyb3VwcywgcGxhc21hfQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSAiQXN5bXB0U3ltcHQyRyIsIHkgPSAiTUNQMV9yYW5rIiwKICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiTUNQMSBwbGFzbWEgW3BnL21MXSBsZXZlbHMgcGVyIHN5bXB0b20iLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJTeW1wdG9tcyIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFzbWEgW3BnL21MXVxuIGludmVyc2UtcmFuayB0cmFuc2Zvcm1hdGlvbiIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIkFzeW1wdFN5bXB0MkciLCAKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGModWl0aG9mX2NvbG9yWzE2XSwgdWl0aG9mX2NvbG9yWzIzXSksCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJkb3RwbG90IiwgIyBBZGQgZG90cGxvdAogICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChiaW53aWR0aCA9IDAuMSwgZG90c2l6ZSA9IDAuMykKICAgICAgICAgICkgKwogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gYygicmlnaHQiKSwgbGVnZW5kLnRpdGxlID0gIlN5bXB0b21zIikKcm0ocDEpCmBgYAoKIyMgRm9yZXN0IHBsb3RzCgpXZSB3b3VsZCBhbHNvIGxpa2UgdG8gdmlzdWFsaXplIHRoZSBtdWx0aXZhcmlhYmxlIGFuYWx5c2VzIHJlc3VsdHMuCmBgYHtyIGxvYWQgbW9kZWwgZGF0YX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG9wZW54bHN4KQptb2RlbDFfbWNwMSA8LSByZWFkLnhsc3gocGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQUVEQi5DRUEuQmluLlVuaS5Qcm90ZWluLlJBTksuU3ltcHRvbXMuTU9ERUwxLnhsc3giKSkKbW9kZWwyX21jcDEgPC0gcmVhZC54bHN4KHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkFFREIuQ0VBLkJpbi5NdWx0aS5Qcm90ZWluLlJBTksuU3ltcHRvbXMuTU9ERUwyLnhsc3giKSkKbW9kZWwxX21jcDEkbW9kZWwgPC0gInVuaXZhcmlhdGUiCm1vZGVsMl9tY3AxJG1vZGVsIDwtICJtdWx0aXZhcmlhdGUiCgptb2RlbHNfbWNwMSA8LSByYmluZChtb2RlbDFfbWNwMSwgbW9kZWwyX21jcDEpCm1vZGVsc19tY3AxCgpgYGAKCmBgYHtyIGZvcmVzdHBsb3QgcGxhcXVlfQpkYXQgPC0gZGF0YS5mcmFtZShncm91cCA9IGZhY3RvcihjKCJBZ2UsIHNleC1hZGp1c3RlZCIsICJBZ2UsIHNleCwgYW5kIGFkanVzdGVkIGZvciByaXNrIGZhY3RvcnMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiQWdlLCBzZXgsIGFuZCBhZGp1c3RlZCBmb3IgcmlzayBmYWN0b3JzIiwgIkFnZSwgc2V4LWFkanVzdGVkIikpLAogICAgICAgICAgICAgICAgICBjZW4gPSBjKG1vZGVsc19tY3AxJE9SW21vZGVsc19tY3AxJFByZWRpY3Rvcj09Ik1DUDFfcGdfdWdfMjAxNV9yYW5rIl0pLAogICAgICAgICAgICAgICAgICBsb3cgPSBjKG1vZGVsc19tY3AxJGxvdzk1Q0lbbW9kZWxzX21jcDEkUHJlZGljdG9yPT0iTUNQMV9wZ191Z18yMDE1X3JhbmsiXSksCiAgICAgICAgICAgICAgICAgIGhpZ2ggPSBjKG1vZGVsc19tY3AxJHVwOTVDSVttb2RlbHNfbWNwMSRQcmVkaWN0b3I9PSJNQ1AxX3BnX3VnXzIwMTVfcmFuayJdKSkKCmZwIDwtIGdncGxvdChkYXRhID0gZGF0LCBhZXMoeCA9IGdyb3VwLCB5ID0gY2VuLCB5bWluID0gbG93LCB5bWF4ID0gaGlnaCkpICsKICBnZW9tX3BvaW50cmFuZ2UobGluZXR5cGUgPSAyLCBzaXplID0gMSwgY29sb3VyID0gYygiIzEyOTBEOSIsICIjNDlBMDFEIikpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgbHR5ID0gMikgKyAgIyBhZGQgYSBkb3R0ZWQgbGluZSBhdCB4PTEgYWZ0ZXIgZmxpcAogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMC44LCAxLjcpKSArICAjIGZsaXAgY29vcmRpbmF0ZXMgKHB1dHMgbGFiZWxzIG9uIHkgYXhpcykKICB4bGFiKCJNb2RlbCIpICsgeWxhYigiT1IgKDk1JSBDSSkgZm9yIHN5bXB0b21hdGljIHBsYXF1ZXMiKSArCiAgZ2d0aXRsZSgiUGxhcXVlIE1DUC0xIGxldmVscyAoMSBTRCBpbmNyZW1lbnQpIikgKwogIHRoZW1lX21pbmltYWwoKSAgIyB1c2UgYSB3aGl0ZSBiYWNrZ3JvdW5kCnByaW50KGZwKQoKcm0oZnApCmBgYAoKCmBgYHtyIGZvcmVzdHBsb3QgcGxhc21hfQpkYXQgPC0gZGF0YS5mcmFtZShncm91cCA9IGZhY3RvcihjKCJBZ2UsIHNleC1hZGp1c3RlZCIsICJBZ2UsIHNleCwgYW5kIGFkanVzdGVkIGZvciByaXNrIGZhY3RvcnMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiQWdlLCBzZXgsIGFuZCBhZGp1c3RlZCBmb3IgcmlzayBmYWN0b3JzIiwgIkFnZSwgc2V4LWFkanVzdGVkIikpLAogICAgICAgICAgICAgICAgICBjZW4gPSBjKG1vZGVsc19tY3AxJE9SW21vZGVsc19tY3AxJFByZWRpY3Rvcj09Ik1DUDFfcmFuayJdKSwKICAgICAgICAgICAgICAgICAgbG93ID0gYyhtb2RlbHNfbWNwMSRsb3c5NUNJW21vZGVsc19tY3AxJFByZWRpY3Rvcj09Ik1DUDFfcmFuayJdKSwKICAgICAgICAgICAgICAgICAgaGlnaCA9IGMobW9kZWxzX21jcDEkdXA5NUNJW21vZGVsc19tY3AxJFByZWRpY3Rvcj09Ik1DUDFfcmFuayJdKSkKCmZwIDwtIGdncGxvdChkYXRhPWRhdCwgYWVzKHg9Z3JvdXAsIHk9Y2VuLCB5bWluPWxvdywgeW1heD1oaWdoKSkgKwogIGdlb21fcG9pbnRyYW5nZSgpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGx0eT0yKSArICAjIGFkZCBhIGRvdHRlZCBsaW5lIGF0IHg9MSBhZnRlciBmbGlwCiAgY29vcmRfZmxpcCgpICsgICMgZmxpcCBjb29yZGluYXRlcyAocHV0cyBsYWJlbHMgb24geSBheGlzKQogIHhsYWIoIk1vZGVsIikgKyB5bGFiKCJPUiAoOTUlIENJKSBmb3Igc3ltcHRvbWF0aWMgcGxhcXVlcyIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKSArCiAgZ2d0aXRsZSgicGxhc21hIE1DUC0xIGxldmVscyAoMSBTRCBpbmNyZW1lbnQpIikgKwogIHRoZW1lX21pbmltYWwoKSAgIyB1c2UgYSB3aGl0ZSBiYWNrZ3JvdW5kCnByaW50KGZwKQpybShmcCkKYGBgCgojIyBNQ1AxIHZzLiBjeXRva2luZXMgcGxhcXVlIGxldmVscyBjb3JyZWxhdGlvbnMKCldlIHdpbGwgcGxvdCB0aGUgY29ycmVsYXRpb25zIG9mIG90aGVyIGN5dG9raW5lIHBsYXF1ZSBsZXZlbHMgdG8gdGhlIE1DUDEgcGxhcXVlIGxldmVscy4gVGhlc2UgaW5jbHVkZToKCi0gSUwyCi0gSUw0Ci0gSUw1Ci0gSUw2Ci0gSUw4Ci0gSUw5Ci0gSUwxMAotIElMMTIKLSBJTDEzCi0gSUwyMQotIElORkcKLSBUTkZBCi0gTUlGCi0gTUNQMQotIE1JUDFhCi0gUkFOVEVTCi0gTUlHCi0gSVAxMAotIEVvdGF4aW4xCi0gVEFSQwotIFBBUkMKLSBNREMKLSBPUEcKLSBzSUNBTTEKLSBWRUdGQQotIFRHRkIKCkluIGFkZGl0aW9uIHdlIHdpbGwgbG9vayBhdCB0aHJlZSBtZXRhbGxvcHJvdGVpbmFzZXMgd2hpY2ggd2VyZSBtZWFzdXJlZCB1c2luZyBhbiBhY3Rpdml0eSBhc3NheS4gCgotIE1NUDIKLSBNTVA4Ci0gTU1QOQoKVGhlIHByb3RlaW5zIHdlcmUgbWVhc3VyZWQgdXNpbmcgRkFDUyBhbmQgTFVNSU5FWC4gR2l2ZW4gdGhlIGRpZmZlcmVudCBwbGF0Zm9ybXMgdXNlZCAoRkFDUyB2cy4gTFVNSU5FWCksIHdlIHdpbGwgaW52ZXJzZSByYW5rLW5vcm1hbGl6ZSB0aGVzZSB2YXJpYWJsZXMgYXMgd2VsbCB0byBzY2FsZSB0aGVtIHRvIHRoZSBzYW1lIHNjYWxlIGFzIHRoZSBNQ1AxIHBsYXF1ZSBsZXZlbHMuCgoKV2Ugd2lsbCBzZXQgdGhlIG1lYXN1cmVtZW50cyB0aGF0IHlpZWxkZWQgJzAnIHRvIE5BLCBhcyBpdCBpcyB1bmxpa2VseSB0aGF0IGFueSBwcm90ZWluIGV2ZXIgaGFzIGV4YWN0bHkgMCBjb3BpZXMuIFRoZSAnMCcgeWllbGRlZCBkdXJpbmcgdGhlIGV4cGVyaW1lbnQgYXJlIGR1ZSB0byB0aGUgbGltaXRzIG9mIHRoZSBkZXRlY3Rpb24uCgojIyMgUHJlcGFyZSBkYXRhCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIElOUlR9CmN5dG9raW5lcyA8LSBjKCJJTDIiLCAiSUw0IiwgIklMNSIsICJJTDYiLCAiSUw4IiwgIklMOSIsICJJTDEwIiwgIklMMTIiLCAiSUwxMyIsICJJTDIxIiwgCiAgICAgICAgICAgICAgICJJTkZHIiwgIlRORkEiLCAiTUlGIiwgIk1DUDEiLCAiTUlQMWEiLCAiUkFOVEVTIiwgIk1JRyIsICJJUDEwIiwgIkVvdGF4aW4xIiwgCiAgICAgICAgICAgICAgICJUQVJDIiwgIlBBUkMiLCAiTURDIiwgIk9QRyIsICJzSUNBTTEiLCAiVkVHRkEiLCAiVEdGQiIpCm1ldGFsbG9wcm90ZWluYXNlcyA8LSBjKCJNTVAyIiwgIk1NUDgiLCAiTU1QOSIpCgojIGZpeCBuYW1lcwpuYW1lcyhBRURCLkNFQSlbbmFtZXMoQUVEQi5DRUEpID09ICJWRUZHQSJdIDwtICJWRUdGQSIKCgpwcm90ZWluc19vZl9pbnRlcmVzdCA8LSBjKGN5dG9raW5lcywgbWV0YWxsb3Byb3RlaW5hc2VzKQoKcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFuayA9IHVubGlzdChsYXBwbHkocHJvdGVpbnNfb2ZfaW50ZXJlc3QsIHBhc3RlMCwgIl9yYW5rIikpCgoKIyBtYWtlIHZhcmlhYmxlcyBudW1lcmljcygpCkFFREIuQ0VBIDwtIEFFREIuQ0VBICU+JQogIG11dGF0ZV9lYWNoKGZ1bnMoYXMubnVtZXJpYyksIHByb3RlaW5zX29mX2ludGVyZXN0KQogIApmb3IoUFJPVEVJTiBpbiAxOmxlbmd0aChwcm90ZWluc19vZl9pbnRlcmVzdCkpewoKICAjIFVDT1JCSU9HU0FxYyRaIDwtIE5VTEwKICB2YXIudGVtcC5yYW5rID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua1tQUk9URUlOXQogIHZhci50ZW1wID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RbUFJPVEVJTl0KICAKICBjYXQocGFzdGUwKCJcblNlbGVjdGluZyAiLCB2YXIudGVtcCwgIiBhbmQgc3RhbmRhcmRpc2luZzogIiwgdmFyLnRlbXAucmFuaywiLlxuIikpCiAgY2F0KHBhc3RlMCgiKiBjaGFuZ2luZyAiLCB2YXIudGVtcCwgIiB0byBudW1lcmljLlxuIikpCgogICMgQUVEQi5DRUEgPC0gIEFFREIuQ0VBICU+JSBtdXRhdGUoQUVEQi5DRUFbLHZhci50ZW1wXSA9PSByZXBsYWNlKEFFREIuQ0VBWyx2YXIudGVtcF0sIEFFREIuQ0VBWyx2YXIudGVtcF09PTAsIE5BKSkKCiAgQUVEQi5DRUFbLHZhci50ZW1wXVtBRURCLkNFQVssdmFyLnRlbXBdPT0wLjAwMDAwMF09TkEKCiAgY2F0KHBhc3RlMCgiKiBzdGFuZGFyZGlzaW5nICIsIHZhci50ZW1wLCAKICAgICAgICAgICAgICIgKG1lYW46ICIscm91bmQobWVhbighaXMubmEoQUVEQi5DRUFbLHZhci50ZW1wXSkpLCBkaWdpdHMgPSA2KSwKICAgICAgICAgICAgICIsIG4gPSAiLHN1bSghaXMubmEoQUVEQi5DRUFbLHZhci50ZW1wXSkpLCIpLlxuIikpCiAgCiAgQUVEQi5DRUEgPC0gQUVEQi5DRUEgJT4lCiAgICAgIG11dGF0ZV9hdCh2YXJzKHZhci50ZW1wKSwgCiAgICAgICAgIyBsaXN0KFogPSB+IChBRURCLkNFQVssdmFyLnRlbXBdIC0gbWVhbihBRURCLkNFQVssdmFyLnRlbXBdLCBuYS5ybSA9IFRSVUUpKS9zZChBRURCLkNFQVssdmFyLnRlbXBdLCBuYS5ybSA9IFRSVUUpKQogICAgICAgIGxpc3QoUkFOSyA9IH4gcW5vcm0oKHJhbmsoQUVEQi5DRUFbLHZhci50ZW1wXSwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCLkNFQVssdmFyLnRlbXBdKSkpKQogICAgICApCiAgIyBzdHIoVUNPUkJJT0dTQXFjJFopCiAgY2F0KHBhc3RlMCgiKiByZW5hbWluZyBSQU5LIHRvICIsIHZhci50ZW1wLnJhbmssIi5cbiIpKQogIEFFREIuQ0VBWyx2YXIudGVtcC5yYW5rXSA8LSBOVUxMCiAgbmFtZXMoQUVEQi5DRUEpW25hbWVzKEFFREIuQ0VBKSA9PSAiUkFOSyJdIDwtIHZhci50ZW1wLnJhbmsKfQoKIyBybSh2YXIudGVtcCwgdmFyLnRlbXAucmFuaykKCmBgYAoKIyMjIFZpc3VhbGl6ZSB0cmFuc2Zvcm1hdGlvbnMKCldlIHdpbGwganVzdCB2aXN1YWxpemUgdGhlc2UgdHJhbnNmb3JtYXRpb25zLgoKYGBge3IgTUNQMSB2cyBDeXRva2luZXMgSGlzdG9ncmFtc30KcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua19tY3AxIDwtIGMoIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgIk1DUDFfcGdfbWxfMjAxNV9yYW5rIiwgcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFuaykKCnByb3RlaW5zX29mX2ludGVyZXN0X21jcDEgPC0gYygiTUNQMV9wZ191Z18yMDE1IiwgIk1DUDFfcGdfbWxfMjAxNSIsIHByb3RlaW5zX29mX2ludGVyZXN0KQoKZm9yKFBST1RFSU4gaW4gcHJvdGVpbnNfb2ZfaW50ZXJlc3RfbWNwMSl7CiAgY2F0KHBhc3RlMCgiUGxvdHRpbmcgcHJvdGVpbiAiLCBQUk9URUlOLCAiLlxuIikpCiAgCiAgcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLkNFQSwgUFJPVEVJTiwKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVhbiIsCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHBhc3RlMChQUk9URUlOLCAiIHBsYXF1ZSBsZXZlbHMiKSwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIiIsCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKICBwcmludChwMSkKICAKfQoKCmZvcihQUk9URUlOIGluIHByb3RlaW5zX29mX2ludGVyZXN0X3JhbmtfbWNwMSl7CiAgY2F0KHBhc3RlMCgiUGxvdHRpbmcgcHJvdGVpbiAiLCBQUk9URUlOLCAiLlxuIikpCiAgCiAgcDEgPC0gZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLkNFQSwgUFJPVEVJTiwKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVhbiIsCiAgICAgICAgICAgICAgICAgICAgIyBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICMgYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHBhc3RlMChQUk9URUlOLCAiIHBsYXF1ZSBsZXZlbHMiKSwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gImludmVyc2Utbm9ybWFsIHRyYW5zZm9ybWF0aW9uIiwKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQogIHByaW50KHAxKQogIAp9CiAgCmBgYAoKIyMjIENvcnJlbGF0aW9ucwoKSGVyZSB3ZSBjYWxjdWxhdGUgY29ycmVsYXRpb25zIGJldHdlZW4gYE1DUDFfcGdfdWdfMjAxNWAgYW5kIDI4IG90aGVyIGN5dG9raW5lcyAoaW5jbHVkaW5nIGBNQ1AxYCBhcyBtZWFzdXJlZCBpbiBleHBlcmltZW50IDEuIFdlIHVzZSBTcGVhcm1hbidzIHRlc3QsIHRodXMsIGNvcnJlbGF0aW9ucyBhIGdpdmVuIGluIF9yaG9fLiBQbGVhc2Ugbm90ZSB0aGUgaW5kaWNhdGlvbnMgb2YgbWVhc3VyZW1lbnQgbWV0aG9kczoKCi0gX0xfOiBMVU1JTkVYCi0gX0VfOiBFTElTQQotIF9hXzogYWN0aXZpdHkgYXNzYXkKCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIGNvcnJlbGF0aW9uc30KIyBJbnN0YWxsYXRpb24gb2YgZ2djb3JycGxvdCgpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYoIXJlcXVpcmUoZGV2dG9vbHMpKSAKICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigia2Fzc2FtYmFyYS9nZ2NvcnJwbG90IikKCmxpYnJhcnkoZ2djb3JycGxvdCkKCiMgQ3JlYXRpbmcgbWF0cml4IC0gaW52ZXJzZS1yYW5rIHRyYW5zZm9ybWF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQUVEQi5DRUEudGVtcCA8LSBzdWJzZXQoQUVEQi5DRUEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IGMocHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua19tY3AxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgojIHN0cihBRURCLkNFQS50ZW1wKQpBRURCLkNFQS5tYXRyaXguUkFOSyA8LSBhcy5tYXRyaXgoQUVEQi5DRUEudGVtcCkKcm0oQUVEQi5DRUEudGVtcCkKCmNvcnJfYmlvbWFya2Vycy5yYW5rIDwtIHJvdW5kKGNvcihBRURCLkNFQS5tYXRyaXguUkFOSywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIsICN0aGUgY29ycmVsYXRpb24gb3IgY292YXJpYW5jZSBiZXR3ZWVuIGVhY2ggcGFpciBvZiB2YXJpYWJsZXMgaXMgY29tcHV0ZWQgdXNpbmcgYWxsIGNvbXBsZXRlIHBhaXJzIG9mIG9ic2VydmF0aW9ucyBvbiB0aG9zZSB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAic3BlYXJtYW4iKSwgMykKIyBjb3JyX2Jpb21hcmtlcnMucmFuawoKcmVuYW1lX3Byb3RlaW5zX29mX2ludGVyZXN0X21jcDEgPC0gYygiTUNQMSAoTCwgZXhwMiwgcGcvdWcpIiwgIk1DUDEgKEwsIGV4cDIsIHBnL21MKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUwyIiwgIklMNCIsICJJTDUiLCAiSUw2IiwgIklMOCIsICJJTDkiLCAiSUwxMCIsICJJTDEyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTDEzIChMKSIsICJJTDIxIChMKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5GRyIsICJUTkZBIiwgIk1JRiAoTCkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1DUDEgKEwsIGV4cDEpIiwgIk1JUDFhIChMKSIsICJSQU5URVMgKEwpIiwgIk1JRyAoTCkiLCAiSVAxMCAoTCkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVvdGF4aW4xIChMKSIsICJUQVJDIChMKSIsICJQQVJDIChMKSIsICJNREMgKEwpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEcgKEwpIiwgInNJQ0FNMSAoTCkiLCAiVkVHRkEgKEUpIiwgIlRHRkIgKEUpIiwgIk1NUDIgKGEpIiwgIk1NUDggKGEpIiwgIk1NUDkgKGEpIikKY29sbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmspIDwtIGMocmVuYW1lX3Byb3RlaW5zX29mX2ludGVyZXN0X21jcDEpCnJvd25hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rKSA8LSBjKHJlbmFtZV9wcm90ZWluc19vZl9pbnRlcmVzdF9tY3AxKQoKY29ycl9iaW9tYXJrZXJzX3AucmFuayA8LSBnZ2NvcnJwbG90Ojpjb3JfcG1hdChBRURCLkNFQS5tYXRyaXguUkFOSywgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIsIG1ldGhvZCA9ICJzcGVhcm1hbiIpCgojICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIyBmbGF0dGVuQ29yck1hdHJpeAojICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIyBjb3JtYXQgOiBtYXRyaXggb2YgdGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cwojIHBtYXQgOiBtYXRyaXggb2YgdGhlIGNvcnJlbGF0aW9uIHAtdmFsdWVzCmZsYXR0ZW5Db3JyTWF0cml4IDwtIGZ1bmN0aW9uKGNvcm1hdCwgcG1hdCkgewogIHV0IDwtIHVwcGVyLnRyaShjb3JtYXQpCiAgZGF0YS5mcmFtZSgKICAgIHJvdyA9IHJvd25hbWVzKGNvcm1hdClbcm93KGNvcm1hdClbdXRdXSwKICAgIGNvbHVtbiA9IHJvd25hbWVzKGNvcm1hdClbY29sKGNvcm1hdClbdXRdXSwKICAgIGNvciAgPShjb3JtYXQpW3V0XSwKICAgIHAgPSBwbWF0W3V0XQogICAgKQp9Cgpjb3JyX2Jpb21hcmtlcnMucmFuay5kZiA8LSBmbGF0dGVuQ29yck1hdHJpeChjb3JyX2Jpb21hcmtlcnMucmFuaywgY29ycl9iaW9tYXJrZXJzX3AucmFuaykKCgpuYW1lcyhjb3JyX2Jpb21hcmtlcnMucmFuay5kZilbbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYpID09ICJyb3ciXSA8LSAiQ3l0b2tpbmVfWCIKbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYpW25hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmKSA9PSAiY29sdW1uIl0gPC0gIkN5dG9raW5lWSIKbmFtZXMoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYpW25hbWVzKGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmKSA9PSAiY29yIl0gPC0gIlNwZWFybWFuUmhvIgoKRFQ6OmRhdGF0YWJsZShjb3JyX2Jpb21hcmtlcnMucmFuay5kZikKCmZ3cml0ZShjb3JyX2Jpb21hcmtlcnMucmFuay5kZiwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5jb3JyZWxhdGlvbl9jeXRva2luZXMudHh0IikpCgpgYGAKCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIGhlYXRtYXB9CiMgQWRkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgYXJndW1lbnQgbGFiID0gVFJVRQpwMSA8LSBnZ2NvcnJwbG90KGNvcnJfYmlvbWFya2Vycy5yYW5rLCAKICAgICAgICAgICBtZXRob2QgPSAic3F1YXJlIiwgCiAgICAgICAgICAgdHlwZSA9ICJsb3dlciIsCiAgICAgICAgICAgdGl0bGUgPSAiQ3Jvc3MgYmlvbWFya2VyIGNvcnJlbGF0aW9ucyIsIAogICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSwgbGVnZW5kLnRpdGxlID0gYnF1b3RlKCJTcGVhcm1hbidzIn5pdGFsaWMocmhvKSksCiAgICAgICAgICAgZ2d0aGVtZSA9IGdncGxvdDI6OnRoZW1lX21pbmltYWwsIG91dGxpbmUuY29sb3IgPSAiI0ZGRkZGRiIsCiAgICAgICAgICAgc2hvdy5kaWFnID0gVFJVRSwKICAgICAgICAgICBoYy5vcmRlciA9IEZBTFNFLCAKICAgICAgICAgICBsYWIgPSBGQUxTRSwKICAgICAgICAgICBkaWdpdHMgPSAzLAogICAgICAgICAgIHRsLmNleCA9IDYsCiAgICAgICAgICAgIyB4bGFiID0gYygiTUNQMSIpLAogICAgICAgICAgICMgcC5tYXQgPSBjb3JyX2Jpb21hcmtlcnNfcC5yYW5rLCBzaWcubGV2ZWwgPSAwLjA1LAogICAgICAgICAgIGNvbG9ycyA9IGMoIiMxMjkwRDkiLCAiI0ZGRkZGRiIsICIjRTU1NzM4IikpCnAxCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5jb3JyZWxhdGlvbl9jeXRva2luZXMucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKcm0ocDEpCgpgYGAKCldoaWxlIHZpc3VhbGx5IGFjdHJhY3RpdmUgd2UgYXJlIG5vdCBuZWNlc3NhcmlseSBpbnRlcmVzdGVkIGluIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBhbGwgdGhlIGN5dG9raW5lcywgcmF0aGVyIG9mIE1DUDEgd2l0aCBvdGhlciBjeXRva2luZXMgb25seS4KCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIGJhcnBsb3R9CnRlbXAgPC0gc3Vic2V0KGNvcnJfYmlvbWFya2Vycy5yYW5rLmRmLCBDeXRva2luZV9YID09ICJNQ1AxIChMLCBleHAyLCBwZy91ZykiICkKdGVtcCRwX2xvZzEwIDwtIC1sb2cxMCh0ZW1wJHApCnBfdGhyZXNob2xkIDwtIC1sb2cxMCgwLjA1LzI5KQpwX3RocmVzaG9sZApwMSA8LSBnZ2JhcnBsb3QodGVtcCwgeCA9ICJDeXRva2luZVkiLCB5ID0gIlNwZWFybWFuUmhvIiwKICAgICAgICAgIGZpbGwgPSAiQ3l0b2tpbmVZIiwgICAgICAgICAgICAgICAjIGNoYW5nZSBmaWxsIGNvbG9yIGJ5IGN5bAogICAgICAgICAgIyBjb2xvciA9ICJ3aGl0ZSIsICAgICAgICAgICAgIyBTZXQgYmFyIGJvcmRlciBjb2xvcnMgdG8gd2hpdGUKICAgICAgICAgIHBhbGV0dGUgPSB1aXRob2ZfY29sb3IsICAgICAgICAgICAgIyBqY28gam91cm5hbCBjb2xvciBwYWxldHQuIHNlZSA/Z2dwYXIKICAgICAgICAgIHhsYWIgPSAiQ3l0b2tpbmUiLAogICAgICAgICAgeWxhYiA9IGV4cHJlc3Npb24oIlNwZWFybWFuJ3Mifml0YWxpYyhyaG8pKSwKICAgICAgICAgIHNvcnQudmFsID0gImRlc2MiLCAgICAgICAgICAjIFNvcnQgdGhlIHZhbHVlIGluIGRzY2VuZGluZyBvcmRlcgogICAgICAgICAgc29ydC5ieS5ncm91cHMgPSBGQUxTRSwgICAgICMgRG9uJ3Qgc29ydCBpbnNpZGUgZWFjaCBncm91cAogICAgICAgICAgeC50ZXh0LmFuZ2xlID0gNDUsICMgUm90YXRlIHZlcnRpY2FsbHkgeCBheGlzIHRleHRzCiAgICAgICAgICBjZXggPSAwLjgKICAgICAgICAgICkKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCAKICAgICAgbGVnZW5kLnRpdGxlID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpKSAKCnJtKHAxKQoKdGVtcCA8LSBzdWJzZXQoY29ycl9iaW9tYXJrZXJzLnJhbmsuZGYsIEN5dG9raW5lX1ggPT0gIk1DUDEgKEwsIGV4cDIsIHBnL21MKSIgKQp0ZW1wJHBfbG9nMTAgPC0gLWxvZzEwKHRlbXAkcCkKcF90aHJlc2hvbGQgPC0gLWxvZzEwKDAuMDUvMjkpCnBfdGhyZXNob2xkCnAxIDwtIGdnYmFycGxvdCh0ZW1wLCB4ID0gIkN5dG9raW5lWSIsIHkgPSAiU3BlYXJtYW5SaG8iLAogICAgICAgICAgZmlsbCA9ICJDeXRva2luZVkiLCAgICAgICAgICAgICAgICMgY2hhbmdlIGZpbGwgY29sb3IgYnkgY3lsCiAgICAgICAgICAjIGNvbG9yID0gIndoaXRlIiwgICAgICAgICAgICAjIFNldCBiYXIgYm9yZGVyIGNvbG9ycyB0byB3aGl0ZQogICAgICAgICAgcGFsZXR0ZSA9IHVpdGhvZl9jb2xvciwgICAgICAgICAgICAjIGpjbyBqb3VybmFsIGNvbG9yIHBhbGV0dC4gc2VlID9nZ3BhcgogICAgICAgICAgeGxhYiA9ICJDeXRva2luZSIsCiAgICAgICAgICB5bGFiID0gZXhwcmVzc2lvbigiU3BlYXJtYW4ncyJ+aXRhbGljKHJobykpLAogICAgICAgICAgc29ydC52YWwgPSAiZGVzYyIsICAgICAgICAgICMgU29ydCB0aGUgdmFsdWUgaW4gZHNjZW5kaW5nIG9yZGVyCiAgICAgICAgICBzb3J0LmJ5Lmdyb3VwcyA9IEZBTFNFLCAgICAgIyBEb24ndCBzb3J0IGluc2lkZSBlYWNoIGdyb3VwCiAgICAgICAgICB4LnRleHQuYW5nbGUgPSA0NSwgIyBSb3RhdGUgdmVydGljYWxseSB4IGF4aXMgdGV4dHMKICAgICAgICAgIGNleCA9IDAuOAogICAgICAgICAgKQpnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIAogICAgICBsZWdlbmQudGl0bGUgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpIAoKcm0ocDEpCgpgYGAKCkFub3RoZXIgdmVyc2lvbiAtIHByb2JsYWJseSBub3QgZ29vZC4gCmBgYHtyIE1DUDEgdnMgQ3l0b2tpbmVzIGRvdGNoYXJ0fQoKcDEgPC0gZ2dkb3RjaGFydCh0ZW1wLCB4ID0gIkN5dG9raW5lWSIsIHkgPSAicF9sb2cxMCIsCiAgICAgICAgICAgY29sb3IgPSAiQ3l0b2tpbmVZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ29sb3IgYnkgZ3JvdXBzCiAgICAgICAgICAgcGFsZXR0ZSA9IHVpdGhvZl9jb2xvciwgIyBDdXN0b20gY29sb3IgcGFsZXR0ZQogICAgICAgICAgIHhsYWIgPSAiQ3l0b2tpbmUiLAogICAgICAgICAgIHlsYWIgPSBleHByZXNzaW9uKGxvZ1sxMF1+Iigifml0YWxpYyhwKX4iKS12YWx1ZSIpLAogICAgICAgICAgIHlsaW0gPSBjKDAsIDYpLAogICAgICAgICAgIHNvcnRpbmcgPSAiZGVzY2VuZGluZyIsICAgICAgICAgICAgICAgICAgICAgICAjIFNvcnQgdmFsdWUgaW4gZGVzY2VuZGluZyBvcmRlcgogICAgICAgICAgIGFkZCA9ICJzZWdtZW50cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBzZWdtZW50cyBmcm9tIHkgPSAwIHRvIGRvdHMKICAgICAgICAgICByb3RhdGUgPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUm90YXRlIHZlcnRpY2FsbHkKICAgICAgICAgICAjIGdyb3VwID0gIkN5dG9raW5lWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9yZGVyIGJ5IGdyb3VwcwogICAgICAgICAgIGRvdC5zaXplID0gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExhcmdlIGRvdCBzaXplCiAgICAgICAgICAgbGFiZWwgPSByb3VuZCh0ZW1wJFNwZWFybWFuUmhvLCBkaWdpdHMgPSAzKSwgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBtcGcgdmFsdWVzIGFzIGRvdCBsYWJlbHMKICAgICAgICAgICBmb250LmxhYmVsID0gbGlzdChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgKQpnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIAogICAgICBsZWdlbmQudGl0bGUgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpCgpybSh0ZW1wLCBwMSkKCmBgYAoKCiMjIE1DUDEgdnMuIGN5dG9raW5lcyBwbGFxdWUgbGV2ZWxzIGBsbSgpYAoKIyMjIE1vZGVsIDEKCkluIHRoaXMgbW9kZWwgd2UgY29ycmVjdCBmb3IgX0FnZV8sIF9HZW5kZXJfLCBhbmQgX3llYXIgb2Ygc3VyZ2VyeV8uCgpIZXJlIHdlIHVzZSB0aGUgaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgZGF0YSAtIHZpc3VhbGx5IHRoaXMgaXMgbW9yZSBub3JtYWxseSBkaXN0cmlidXRlZC4KCkFuYWx5c2lzIG9mIHBsYXF1ZSBjeXRva2luZXMgdHJhaXRzIGFzIGEgZnVuY3Rpb24gb2YgcGxhc21hL3BsYXF1ZSBNQ1AxIGxldmVscy4KYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMSBSQU5LLCBpbmNsdWRlPVRSVUUsIHBhZ2VkLnByaW50PVRSVUV9CgpHTE0ucmVzdWx0cyA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE1LCBucm93ID0gMCkpCmNhdCgiUnVubmluZyBsaW5lYXIgcmVncmVzc2lvbi4uLlxuIikKZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTkspKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5QUk9URUlOLlJBTktbcHJvdGVpbl0KICBjYXQocGFzdGUwKCJcbkFuYWx5c2lzIG9mICIsUFJPVEVJTiwiLlxuIikpCiAgZm9yICh0cmFpdCBpbiAxOmxlbmd0aChwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rKSkgewogICAgVFJBSVQgPSBwcm90ZWluc19vZl9pbnRlcmVzdF9yYW5rW3RyYWl0XQogICAgY2F0KHBhc3RlMCgiXG4tIHByb2Nlc3NpbmcgIixUUkFJVCwiXG5cbiIpKQogICAgY3VycmVudERGIDwtIGFzLmRhdGEuZnJhbWUoQUVEQi5DRUEgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3QoLiwgUFJPVEVJTiwgVFJBSVQsIENPVkFSSUFURVNfTTEpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKQogICAgIyBmb3IgZGVidWcKICAgICMgcHJpbnQoRFQ6OmRhdGF0YWJsZShjdXJyZW50REYpKQogICAgIyBwcmludChucm93KGN1cnJlbnRERikpCiAgICAjIHByaW50KHN0cihjdXJyZW50REYpKQogICAgIyMjIHVuaXZhcmlhdGUKICAgIGZpdCA8LSBsbShjdXJyZW50REZbLFBST1RFSU5dIH4gY3VycmVudERGWyxUUkFJVF0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfeWVhciwgZGF0YSA9IGN1cnJlbnRERikKICAgIG1vZGVsX3N0ZXAgPC0gc3RlcEFJQyhmaXQsIGRpcmVjdGlvbiA9ICJib3RoIiwgdHJhY2UgPSBGQUxTRSkKICAgIHByaW50KG1vZGVsX3N0ZXApCiAgICBwcmludChzdW1tYXJ5KGZpdCkpCgogICAgR0xNLnJlc3VsdHMuVEVNUCA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE1LCBucm93ID0gMCkpCiAgICBHTE0ucmVzdWx0cy5URU1QWzEsXSA9IEdMTS5DT04oZml0LCAiQUVEQi5DRUEiLCBQUk9URUlOLCBUUkFJVCwgdmVyYm9zZSA9IFRSVUUpCiAgICBHTE0ucmVzdWx0cyA9IHJiaW5kKEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QKQogIH0KfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiVC12YWx1ZSIsICJQLXZhbHVlIiwgInJeMiIsICJyXjJfYWRqIiwgIkFFX04iLCAiTW9kZWxfTiIsICJQZXJjX01pc3MiKQoKY2F0KCJDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKR0xNLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJEJldGEpCkdMTS5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHMuZS5tLikKR0xNLnJlc3VsdHMkT1IgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRPUikKR0xNLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGxvdzk1Q0kpCkdMTS5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHVwOTVDSSkKR0xNLnJlc3VsdHMkYFQtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFQtdmFsdWVgKQpHTE0ucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUC12YWx1ZWApCkdMTS5yZXN1bHRzJGByXjJgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMmApCkdMTS5yZXN1bHRzJGByXjJfYWRqYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfYWRqYCkKR0xNLnJlc3VsdHMkYEFFX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYEFFX05gKQpHTE0ucmVzdWx0cyRgTW9kZWxfTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgTW9kZWxfTmApCkdMTS5yZXN1bHRzJGBQZXJjX01pc3NgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2ApCmBgYAoKYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMSBSQU5LIFdyaXRpbmd9CkRUOjpkYXRhdGFibGUoR0xNLnJlc3VsdHMpCgojIFNhdmUgdGhlIGRhdGEKY2F0KCJXcml0aW5nIHJlc3VsdHMgdG8gRXhjZWwtZmlsZS4uLlxuIikKIyMjIFVuaXZhcmlhdGUKbGlicmFyeShvcGVueGxzeCkKd3JpdGUueGxzeChHTE0ucmVzdWx0cywKICAgICAgICAgICBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIixUb2RheSwiLkFFREIuQ0VBLkNvbi5VbmkuTUNQMV9QbGFxdWUuQ3l0b2tpbmVzX1BsYXF1ZXMuUkFOSy5NT0RFTDEueGxzeCIpLAogICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQ29uLlVuaS5QbGFxdWVQaGVubyIpCiMgUmVtb3ZpbmcgaW50ZXJtZWRpYXRlcwpjYXQoIlJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcy4uLlxuIikKcm0oVFJBSVQsIHRyYWl0LCBjdXJyZW50REYsIEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QLCBmaXQsIG1vZGVsX3N0ZXApCgoKYGBgCgoKCiMjIyBNb2RlbCAyCgpJbiB0aGlzIG1vZGVsIHdlIGNvcnJlY3QgZm9yIF9BZ2VfLCBfR2VuZGVyXywgX3llYXIgb2Ygc3VyZ2VyeV8sIF9IeXBlcnRlbnNpb24gc3RhdHVzXywgX0RpYWJldGVzIHN0YXR1c18sIF9jdXJyZW50IHNtb2tlciBzdGF0dXNfLCBfbGlwaWQtbG93ZXJpbmcgZHJ1Z3MgKExMRHMpXywgX2FudGlwbGF0ZWxldCBtZWRpY2F0aW9uXywgX2VHRlIgKE1EUkQpXywgX0JNSV8sIF9NZWRIeF9DVkRfIChjb21iaW5hdGlvbiBvZiBfQ0FEIGhpc3RvcnlfLCBfc3Ryb2tlIGhpc3RvcnlfLCBhbmQgX3BlcmlwaGVyYWwgaW50ZXJ2ZW50aW9uc18pLCBhbmQgX3N0ZW5vc2lzXy4KCkhlcmUgd2UgdXNlIHRoZSBpbnZlcnNlLXJhbmsgbm9ybWFsaXplZCBkYXRhIC0gdmlzdWFsbHkgdGhpcyBpcyBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLgoKQW5hbHlzaXMgb2YgcGxhcXVlIGN5dG9raW5lcyBhcyBhIGZ1bmN0aW9uIG9mIHBsYXNtYS9wbGFxdWUgTUNQMSBsZXZlbHMuCmBgYHtyIENyb3NzU2VjOiBDeXRva2luZXMgLSBsaW5lYXIgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgaW5jbHVkZT1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNSwgbnJvdyA9IDApKQpjYXQoIlJ1bm5pbmcgbGluZWFyIHJlZ3Jlc3Npb24uLi5cbiIpCmZvciAocHJvdGVpbiBpbiAxOmxlbmd0aChUUkFJVFMuUFJPVEVJTi5SQU5LKSkgewogIFBST1RFSU4gPSBUUkFJVFMuUFJPVEVJTi5SQU5LW3Byb3RlaW5dCiAgY2F0KHBhc3RlMCgiXG5BbmFseXNpcyBvZiAiLFBST1RFSU4sIi5cbiIpKQogIGZvciAodHJhaXQgaW4gMTpsZW5ndGgocHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFuaykpIHsKICAgIFRSQUlUID0gcHJvdGVpbnNfb2ZfaW50ZXJlc3RfcmFua1t0cmFpdF0KICAgIGNhdChwYXN0ZTAoIlxuLSBwcm9jZXNzaW5nICIsVFJBSVQsIlxuXG4iKSkKICAgIGN1cnJlbnRERiA8LSBhcy5kYXRhLmZyYW1lKEFFREIuQ0VBICU+JQogICAgICBkcGx5cjo6c2VsZWN0KC4sIFBST1RFSU4sIFRSQUlULCBDT1ZBUklBVEVTX00yKSAlPiUKICAgICAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKSkgJT4lCiAgICAgIGZpbHRlcl9pZih+aXMubnVtZXJpYyguKSwgYWxsX3ZhcnMoIWlzLmluZmluaXRlKC4pKSkKICAgICMgZm9yIGRlYnVnCiAgICAjIHByaW50KERUOjpkYXRhdGFibGUoY3VycmVudERGKSkKICAgICMgcHJpbnQobnJvdyhjdXJyZW50REYpKQogICAgIyBwcmludChzdHIoY3VycmVudERGKSkKICAgICMjIyB1bml2YXJpYXRlCiAgICBmaXQgPC0gbG0oY3VycmVudERGWyxQUk9URUlOXSB+IGN1cnJlbnRERlssVFJBSVRdICsgQWdlICsgR2VuZGVyICsgT1JkYXRlX3llYXIgKyAKICAgICAgICAgICAgICAgIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlclN0YXR1cyArIAogICAgICAgICAgICAgICAgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgCiAgICAgICAgICAgICAgICBNZWRIeF9DVkQgKyBzdGVub3NlLCAKICAgICAgICAgICAgICBkYXRhID0gY3VycmVudERGKQogICAgbW9kZWxfc3RlcCA8LSBzdGVwQUlDKGZpdCwgZGlyZWN0aW9uID0gImJvdGgiLCB0cmFjZSA9IEZBTFNFKQogICAgcHJpbnQobW9kZWxfc3RlcCkKICAgIHByaW50KHN1bW1hcnkoZml0KSkKICAgIAogICAgR0xNLnJlc3VsdHMuVEVNUCA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbmNvbCA9IDE1LCBucm93ID0gMCkpCiAgICBHTE0ucmVzdWx0cy5URU1QWzEsXSA9IEdMTS5DT04oZml0LCAiQUVEQi5DRUEiLCBQUk9URUlOLCBUUkFJVCwgdmVyYm9zZSA9IFRSVUUpCiAgICBHTE0ucmVzdWx0cyA9IHJiaW5kKEdMTS5yZXN1bHRzLCBHTE0ucmVzdWx0cy5URU1QKQogIH0KfQpjYXQoIkVkaXQgdGhlIGNvbHVtbiBuYW1lcy4uLlxuIikKY29sbmFtZXMoR0xNLnJlc3VsdHMpID0gYygiRGF0YXNldCIsICJQcmVkaWN0b3IiLCAiVHJhaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJCZXRhIiwgInMuZS5tLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk9SIiwgImxvdzk1Q0kiLCAidXA5NUNJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiVC12YWx1ZSIsICJQLXZhbHVlIiwgInJeMiIsICJyXjJfYWRqIiwgIkFFX04iLCAiTW9kZWxfTiIsICJQZXJjX01pc3MiKQoKY2F0KCJDb3JyZWN0IHRoZSB2YXJpYWJsZSB0eXBlcy4uLlxuIikKR0xNLnJlc3VsdHMkQmV0YSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJEJldGEpCkdMTS5yZXN1bHRzJHMuZS5tLiA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHMuZS5tLikKR0xNLnJlc3VsdHMkT1IgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRPUikKR0xNLnJlc3VsdHMkbG93OTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGxvdzk1Q0kpCkdMTS5yZXN1bHRzJHVwOTVDSSA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJHVwOTVDSSkKR0xNLnJlc3VsdHMkYFQtdmFsdWVgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFQtdmFsdWVgKQpHTE0ucmVzdWx0cyRgUC12YWx1ZWAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgUC12YWx1ZWApCkdMTS5yZXN1bHRzJGByXjJgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYHJeMmApCkdMTS5yZXN1bHRzJGByXjJfYWRqYCA8LSBhcy5udW1lcmljKEdMTS5yZXN1bHRzJGByXjJfYWRqYCkKR0xNLnJlc3VsdHMkYEFFX05gIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYEFFX05gKQpHTE0ucmVzdWx0cyRgTW9kZWxfTmAgPC0gYXMubnVtZXJpYyhHTE0ucmVzdWx0cyRgTW9kZWxfTmApCkdMTS5yZXN1bHRzJGBQZXJjX01pc3NgIDwtIGFzLm51bWVyaWMoR0xNLnJlc3VsdHMkYFBlcmNfTWlzc2ApCmBgYAoKYGBge3IgQ3Jvc3NTZWM6IEN5dG9raW5lcyAtIGxpbmVhciByZWdyZXNzaW9uIE1PREVMMiBSQU5LLCB3cml0aW5nfQpEVDo6ZGF0YXRhYmxlKEdMTS5yZXN1bHRzKQoKIyBTYXZlIHRoZSBkYXRhCmNhdCgiV3JpdGluZyByZXN1bHRzIHRvIEV4Y2VsLWZpbGUuLi5cbiIpCiMjIyBVbml2YXJpYXRlCmxpYnJhcnkob3Blbnhsc3gpCndyaXRlLnhsc3goR0xNLnJlc3VsdHMsCiAgICAgICAgICAgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi5BRURCLkNFQS5Db24uTXVsdGkuTUNQMV9QbGFxdWUuQ3l0b2tpbmVzX1BsYXF1ZXMuUkFOSy5NT0RFTDIueGxzeCIpLAogICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzaGVldE5hbWUgPSAiQ29uLk11bHRpLlBsYXF1ZVBoZW5vIikKIyBSZW1vdmluZyBpbnRlcm1lZGlhdGVzCmNhdCgiUmVtb3ZpbmcgaW50ZXJtZWRpYXRlIGZpbGVzLi4uXG4iKQpybShUUkFJVCwgdHJhaXQsIGN1cnJlbnRERiwgR0xNLnJlc3VsdHMsIEdMTS5yZXN1bHRzLlRFTVAsIGZpdCwgbW9kZWxfc3RlcCkKCgpgYGAKCiMjIE1DUDEgY3l0b2tpbmVzIHBsYXF1ZSBsZXZlbHMgdnMuIHZ1bG5lcmFiaWxpdHkgaW5kZXgKCkhlcmUgd2UgY2FsY3VsYXRlIHRoZSBwbGFxdWUgaW5zdGFiaWxpdHkvdnVsbmVyYWJpbGl0eSBpbmRleAoKYGBge3IgUGxhcXVlIFZ1bG5lcmFiaWxpdHl9CiMgUGxhcXVlIHZ1bG5lcmFiaWxpdHkKCnRhYmxlKEFFREIuQ0VBJE1hY3JvcGhhZ2VzLmJpbikKdGFibGUoQUVEQi5DRUEkRmF0LmJpbl8xMCkKdGFibGUoQUVEQi5DRUEkQ29sbGFnZW4uYmluKQp0YWJsZShBRURCLkNFQSRTTUMuYmluKQp0YWJsZShBRURCLkNFQSRJUEguYmluKQoKIyBTUFNTIGNvZGUKCiMgCiMgKioqIHN5bnRheC0gUGxhcXVlIHZ1bG5lcmFiaWxpdHkqKi4KIyBDT01QVVRFIE1hY3JvX2luc3RhYiA9IC05OTkuCiMgSUYgbWFjcm9waGFnZXMuYmluPTIgTWFjcm9faW5zdGFiPTEuCiMgSUYgbWFjcm9waGFnZXMuYmluPTEgTWFjcm9faW5zdGFiPTAuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIEZhdDEwX2luc3RhYiA9IC05OTkuCiMgSUYgRmF0LmJpbl8xMD0yIEZhdDEwX2luc3RhYj0xLgojIElGIEZhdC5iaW5fMTA9MSBGYXQxMF9pbnN0YWI9MC4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgY29sbF9pbnN0YWI9LTk5OS4KIyBJRiBDb2xsYWdlbi5iaW49MiBjb2xsX2luc3RhYj0wLgojIElGIENvbGxhZ2VuLmJpbj0xIGNvbGxfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyAKIyBDT01QVVRFIFNNQ19pbnN0YWI9LTk5OS4KIyBJRiBTTUMuYmluPTIgU01DX2luc3RhYj0wLgojIElGIFNNQy5iaW49MSBTTUNfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIElQSF9pbnN0YWI9LTk5OS4KIyBJRiBJUEguYmluPTAgSVBIX2luc3RhYj0wLgojIElGIElQSC5iaW49MSBJUEhfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIEluc3RhYmlsaXR5PU1hY3JvX2luc3RhYiArIEZhdDEwX2luc3RhYiArICBjb2xsX2luc3RhYiArIFNNQ19pbnN0YWIgKyBJUEhfaW5zdGFiLgojIEVYRUNVVEUuCgojIEZpeCBwbGFxdWVwaGVub3R5cGVzCmF0dGFjaChBRURCLkNFQSkKIyBtYWMgaW5zdGFiaWxpdHkKQUVEQi5DRUFbLCJNQUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCLkNFQSRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09IC05OTldIDwtIE5BCkFFREIuQ0VBJE1BQ19JbnN0YWJpbGl0eVtNYWNyb3BoYWdlcy5iaW4gPT0gIm5vL21pbm9yIl0gPC0gMApBRURCLkNFQSRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDEKCiMgZmF0IGluc3RhYmlsaXR5CkFFREIuQ0VBWywiRkFUMTBfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCLkNFQSRGQVQxMF9JbnN0YWJpbGl0eVtGYXQuYmluXzEwID09IC05OTldIDwtIE5BCkFFREIuQ0VBJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gIiA8MTAlIl0gPC0gMApBRURCLkNFQSRGQVQxMF9JbnN0YWJpbGl0eVtGYXQuYmluXzEwID09ICIgPjEwJSJdIDwtIDEKCiMgY29sIGluc3RhYmlsaXR5IApBRURCLkNFQVssIkNPTF9JbnN0YWJpbGl0eSJdIDwtIE5BCkFFREIuQ0VBJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQi5DRUEkQ09MX0luc3RhYmlsaXR5W0NvbGxhZ2VuLmJpbiA9PSAibm8vbWlub3IiXSA8LSAxCkFFREIuQ0VBJENPTF9JbnN0YWJpbGl0eVtDb2xsYWdlbi5iaW4gPT0gIm1vZGVyYXRlL2hlYXZ5Il0gPC0gMAoKIyBzbWMgaW5zdGFiaWxpdHkKQUVEQi5DRUFbLCJTTUNfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCLkNFQSRTTUNfSW5zdGFiaWxpdHlbU01DLmJpbiA9PSAtOTk5XSA8LSBOQQpBRURCLkNFQSRTTUNfSW5zdGFiaWxpdHlbU01DLmJpbiA9PSAibm8vbWlub3IiXSA8LSAxCkFFREIuQ0VBJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09ICJtb2RlcmF0ZS9oZWF2eSJdIDwtIDAKCiMgaXBoIGluc3RhYmlsaXR5CkFFREIuQ0VBWywiSVBIX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQi5DRUEkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gLTk5OV0gPC0gTkEKQUVEQi5DRUEkSVBIX0luc3RhYmlsaXR5W0lQSC5iaW4gPT0gIm5vIl0gPC0gMApBRURCLkNFQSRJUEhfSW5zdGFiaWxpdHlbSVBILmJpbiA9PSAieWVzIl0gPC0gMQoKZGV0YWNoKEFFREIuQ0VBKQoKdGFibGUoQUVEQi5DRUEkTUFDX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIuQ0VBJEZBVDEwX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIuQ0VBJENPTF9JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCLkNFQSRTTUNfSW5zdGFiaWxpdHksIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQi5DRUEkSVBIX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCgojIGNyZWF0aW5nIHZ1bG5lcmFiaWxpdHkgaW5kZXgKQUVEQi5DRUEgPC0gQUVEQi5DRUEgJT4lIG11dGF0ZShQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCA9IGZhY3Rvcihyb3dTdW1zKC5bZ3JlcCgiX0luc3RhYmlsaXR5IiwgbmFtZXMoLikpXSwgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKdGFibGUoQUVEQi5DRUEkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsIHVzZU5BID0gImlmYW55IikKCiMgc3RyKEFFREIuQ0VBJFBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4KQoKYGBgCgpIZXJlIHdlIHBsb3QgdGhlIGxldmVscyBvZiBpbnZlcnNlLXJhbmsgbm9ybWFsIHRyYW5zZm9ybWVkIGBNQ1AxYCBwbGFxdWUgbGV2ZWxzIGZyb20gZXhwZXJpbWVudCAxIGFuZCAyIHRvIHRoZSBgUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXhgLiAKYGBge3IgRml4IE9SeWVhckdyb3VwfQpsaWJyYXJ5KHNqbGFiZWxsZWQpCmF0dGFjaChBRURCLkNFQSkKQUVEQi5DRUEkeWVhcnRlbXAgPC0gYXMubnVtZXJpYyh5ZWFyKEFFREIuQ0VBJGRhdGVvaykpCkFFREIuQ0VBWywiT1J5ZWFyR3JvdXAiXSA8LSBOQQpBRURCLkNFQSRPUnllYXJHcm91cFt5ZWFydGVtcCA8PSAyMDA3XSA8LSAiPCAyMDA3IgpBRURCLkNFQSRPUnllYXJHcm91cFt5ZWFydGVtcCA+IDIwMDddIDwtICI+IDIwMDciCmRldGFjaChBRURCLkNFQSkKCnRhYmxlKEFFREIuQ0VBJE9SeWVhckdyb3VwLCBBRURCLkNFQSRPUmRhdGVfeWVhcikKYGBgCgpgYGB7ciBNQ1AxIHBlciBQbGFxdWVWdWxuZXJhYmlsaXR5SW5kZXh9CiMgR2xvYmFsIHRlc3QKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gR2VuZGVyLCAgZGF0YSA9IEFFREIuQ0VBLCBtZXRob2QgPSAid2lsY294LnRlc3QiKQpwMSA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy91Z11cbihJTlQsIGV4cCAyKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiKQpnZ3BhcihwMSwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAyIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ19tbF8yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL21MXVxuKElOVCwgZXhwIDIpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAzIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy9tTF1cbihJTlQsIGV4cCAxKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIikgIysKICAjIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAia3J1c2thbC50ZXN0IikKZ2dwYXIocDMsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQoKCnAxIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9wZ191Z18yMDE1X3JhbmsiLCAKICAgICAgICAgICAgICAgICAgeGxhYiA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIsCiAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTUNQMSBwbGFxdWUgW3BnL3VnXVxuKElOVCwgZXhwIDIpIiwKICAgICAgICAgICAgICAgICAgY29sb3IgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICBwYWxldHRlID0gIm5wZyIsCiAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gIk9SeWVhckdyb3VwIiwKICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIpICMrCiAgIyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gIndpbGNveC50ZXN0IikKZ2dwYXIocDEsIGxlZ2VuZCA9ICJib3R0b20iLCBsZWdlbmQudGl0bGUgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiKQoKIyBjb21wYXJlX21lYW5zKE1DUDFfcGdfdWdfMjAxNV9yYW5rIH4gQWdlR3JvdXAsICBkYXRhID0gQUVEQi5DRUEsIG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpwMiA8LSBnZ3B1YnI6OmdnYm94cGxvdChBRURCLkNFQSwgCiAgICAgICAgICAgICAgICAgIHggPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiLAogICAgICAgICAgICAgICAgICB5ID0gIk1DUDFfcGdfbWxfMjAxNV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy9tTF1cbihJTlQsIGV4cCAyKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMiwgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCgojIGNvbXBhcmVfbWVhbnMoTUNQMV9wZ191Z18yMDE1X3JhbmsgfiBBZ2VHcm91cCwgIGRhdGEgPSBBRURCLkNFQSwgbWV0aG9kID0gImtydXNrYWwudGVzdCIpCnAzIDwtIGdncHVicjo6Z2dib3hwbG90KEFFREIuQ0VBLCAKICAgICAgICAgICAgICAgICAgeCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIsCiAgICAgICAgICAgICAgICAgIHkgPSAiTUNQMV9yYW5rIiwgCiAgICAgICAgICAgICAgICAgIHhsYWIgPSAiUGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXgiLAogICAgICAgICAgICAgICAgICB5bGFiID0gIk1DUDEgcGxhcXVlIFtwZy9tTF1cbihJTlQsIGV4cCAxKSIsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gIlBsYXF1ZV9WdWxuZXJhYmlsaXR5X0luZGV4IiwKICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJucGciLAogICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJPUnllYXJHcm91cCIsCiAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiKSAjKwogICMgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJrcnVza2FsLnRlc3QiKQpnZ3BhcihwMywgbGVnZW5kID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9ICJQbGFxdWUgdnVsbmVyYWJpbGl0eSBpbmRleCIpCmBgYAoKCiMjIyBNb2RlbCAxCgpJbiB0aGlzIG1vZGVsIHdlIGNvcnJlY3QgZm9yIF9BZ2VfLCBfR2VuZGVyXywgYW5kIF95ZWFyIG9mIHN1cmdlcnlfLgoKSGVyZSB3ZSB1c2UgdGhlIGludmVyc2UtcmFuayBub3JtYWxpemVkIGRhdGEgLSB2aXN1YWxseSB0aGlzIGlzIG1vcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCgpBbmFseXNpcyBvZiB0aGUgcGxhcXVlIHZ1bG5lcmFiaWxpdHkgaW5kZXogYXMgYSBmdW5jdGlvbiBvZiBwbGFzbWEvcGxhcXVlIE1DUDEgbGV2ZWxzLgpgYGB7ciBDcm9zc1NlYzogUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXggLSBvcmRpbmFsIHJlZ3Jlc3Npb24gTU9ERUwxIFJBTkssIGluY2x1ZGU9VFJVRSwgcGFnZWQucHJpbnQ9VFJVRX0KVFJBSVRTLlBST1RFSU4uUkFOSy5leHRyYSA9IGMoIk1DUDFfcGdfdWdfMjAxNV9yYW5rIiwgIk1DUDFfcGdfbWxfMjAxNV9yYW5rIiwgICJNQ1AxX3JhbmsiKQoKR0xNLnJlc3VsdHMgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5jb2wgPSAxNiwgbnJvdyA9IDApKQpmb3IgKHByb3RlaW4gaW4gMTpsZW5ndGgoVFJBSVRTLlBST1RFSU4uUkFOSy5leHRyYSkpIHsKICBQUk9URUlOID0gVFJBSVRTLlBST1RFSU4uUkFOSy5leHRyYVtwcm90ZWluXQogIGNhdChwYXN0ZTAoIlxuQW5hbHlzaXMgb2YgIixQUk9URUlOLCIuXG4iKSkKICBUUkFJVCA9ICJQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCIKICAgIGNhdChwYXN0ZTAoIlxuLSBwcm9jZXNzaW5nICIsVFJBSVQsIlxuXG4iKSkKICAgIGN1cnJlbnRERiA8LSBhcy5kYXRhLmZyYW1lKEFFREIuQ0VBICU+JQogICAgICBkcGx5cjo6c2VsZWN0KC4sIFBST1RFSU4sIFRSQUlULCBDT1ZBUklBVEVTX00xLCBPUmRhdGVfZXBvY2gpICU+JQogICAgICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpKSAlPiUKICAgICAgZmlsdGVyX2lmKH5pcy5udW1lcmljKC4pLCBhbGxfdmFycyghaXMuaW5maW5pdGUoLikpKQogICAgIyBmb3IgZGVidWcKICAgICMgcHJpbnQoRFQ6OmRhdGF0YWJsZShjdXJyZW50REYpKQogICAgIyBwcmludChucm93KGN1cnJlbnRERikpCiAgICAjIHByaW50KHN0cihjdXJyZW50REYpKQogICAgIyBwcmludChjbGFzcyhjdXJyZW50REZbLFRSQUlUXSkpCiAgICAjIHRhYmxlKGN1cnJlbnRERiRPUmRhdGVfeWVhcikKICAgICMjIyB1bml2YXJpYXRlCiAgICAgIyArIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlckN1cnJlbnQgKyAKICAgICAjICAgICAgICAgICAgTWVkLlN0YXRpbi5MTEQgKyBNZWQuYWxsLmFudGlwbGF0ZWxldCArIEdGUl9NRFJEICsgQk1JICsgCiAgICAgIyAgICAgICAgICAgIENBRF9oaXN0b3J5ICsgU3Ryb2tlX2hpc3RvcnkgKyBQZXJpcGhlcmFsLmludGVydiArIHN0ZW5vc2UKICAgIGZpdCA8LSBwb2xyKGN1cnJlbnRERlssVFJBSVRdIH4gY3VycmVudERGWyxQUk9URUlOXSArIEFnZSArIEdlbmRlciArIE9SZGF0ZV95ZWFyLCAKICAgICAgICAgICAgICBkYXRhICA9ICBjdXJyZW50REYsIAogICAgICAgICAgICAgIEhlc3MgPSBUUlVFKQogICAgcHJpbnQoc3VtbWFyeShmaXQpKQogICAgCiAgICAjIyBzdG9yZSB0YWJsZQogICAgKGN0YWJsZSA8LSBjb2VmKHN1bW1hcnkoZml0KSkpCgogICAgIyMgY2FsY3VsYXRlIGFuZCBzdG9yZSBwIHZhbHVlcwogICAgcCA8LSBwbm9ybShhYnMoY3RhYmxlWywgInQgdmFsdWUiXSksIGxvd2VyLnRhaWwgPSBGQUxTRSkgKiAyCiAgICAKICAgICMjIGNvbWJpbmVkIHRhYmxlCiAgICBwcmludCgoY3RhYmxlIDwtIGNiaW5kKGN0YWJsZSwgInAgdmFsdWUiID0gcCkpKQogIH0KCmBgYAoKIyMjIE1vZGVsIDIKCkluIHRoaXMgbW9kZWwgd2UgY29ycmVjdCBmb3IgX0FnZV8sIF9HZW5kZXJfLCBfSHlwZXJ0ZW5zaW9uIHN0YXR1c18sIF9EaWFiZXRlcyBzdGF0dXNfLCBfY3VycmVudCBzbW9rZXIgc3RhdHVzXywgX2xpcGlkLWxvd2VyaW5nIGRydWdzIChMTERzKV8sIF9hbnRpcGxhdGVsZXQgbWVkaWNhdGlvbl8sIF9lR0ZSIChNRFJEKV8sIF9CTUlfLCBfTWVkSHhfQ1ZEXyAoY29tYmluYXRpb24gb2YgX0NBRCBoaXN0b3J5XywgX3N0cm9rZSBoaXN0b3J5XywgYW5kIF9wZXJpcGhlcmFsIGludGVydmVudGlvbnNfKSwgYW5kIF9zdGVub3Npcy5fLgoKCmBgYHtyIENyb3NzU2VjOiBQbGFxdWVfVnVsbmVyYWJpbGl0eV9JbmRleCAtIG9yZGluYWwgcmVncmVzc2lvbiBNT0RFTDIgUkFOSywgaW5jbHVkZT1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQoKZm9yIChwcm90ZWluIGluIDE6bGVuZ3RoKFRSQUlUUy5QUk9URUlOLlJBTksuZXh0cmEpKSB7CiAgUFJPVEVJTiA9IFRSQUlUUy5QUk9URUlOLlJBTksuZXh0cmFbcHJvdGVpbl0KICBjYXQocGFzdGUwKCJcbkFuYWx5c2lzIG9mICIsUFJPVEVJTiwiLlxuIikpCiAgVFJBSVQgPSAiUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgiCiAgICBjYXQocGFzdGUwKCJcbi0gcHJvY2Vzc2luZyAiLFRSQUlULCJcblxuIikpCiAgICBjdXJyZW50REYgPC0gYXMuZGF0YS5mcmFtZShBRURCLkNFQSAlPiUKICAgICAgZHBseXI6OnNlbGVjdCguLCBQUk9URUlOLCBUUkFJVCwgQ09WQVJJQVRFU19NMikgJT4lCiAgICAgIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkpICU+JQogICAgICBmaWx0ZXJfaWYofmlzLm51bWVyaWMoLiksIGFsbF92YXJzKCFpcy5pbmZpbml0ZSguKSkpCiAgICAjIGZvciBkZWJ1ZwogICAgIyBwcmludChEVDo6ZGF0YXRhYmxlKGN1cnJlbnRERikpCiAgICAjIHByaW50KG5yb3coY3VycmVudERGKSkKICAgICMgcHJpbnQoc3RyKGN1cnJlbnRERikpCiAgICAjIHByaW50KGNsYXNzKGN1cnJlbnRERlssVFJBSVRdKSkKICAgICMjIyB1bml2YXJpYXRlCgogICAgZml0IDwtIHBvbHIoYXMuZmFjdG9yKGN1cnJlbnRERlssVFJBSVRdKSB+IGN1cnJlbnRERlssUFJPVEVJTl0gKyBBZ2UgKyBHZW5kZXIgKyBPUmRhdGVfeWVhciArIEh5cGVydGVuc2lvbi5jb21wb3NpdGUgKyBEaWFiZXRlc1N0YXR1cyArIFNtb2tlclN0YXR1cyArIE1lZC5TdGF0aW4uTExEICsgTWVkLmFsbC5hbnRpcGxhdGVsZXQgKyBHRlJfTURSRCArIEJNSSArIE1lZEh4X0NWRCArIHN0ZW5vc2UsIAogICAgICAgICAgICAgIGRhdGEgID0gIGN1cnJlbnRERiwgCiAgICAgICAgICAgICAgSGVzcyA9IFRSVUUpCgogICAgcHJpbnQoc3VtbWFyeShmaXQpKQogICAgCiAgICAjIyBzdG9yZSB0YWJsZQogICAgKGN0YWJsZSA8LSBjb2VmKHN1bW1hcnkoZml0KSkpCgogICAgIyMgY2FsY3VsYXRlIGFuZCBzdG9yZSBwIHZhbHVlcwogICAgcCA8LSBwbm9ybShhYnMoY3RhYmxlWywgInQgdmFsdWUiXSksIGxvd2VyLnRhaWwgPSBGQUxTRSkgKiAyCiAgICAKICAgICMjIGNvbWJpbmVkIHRhYmxlCiAgICBwcmludCgoY3RhYmxlIDwtIGNiaW5kKGN0YWJsZSwgInAgdmFsdWUiID0gcCkpKQogIH0KCgpgYGAKCiMjIENvbXBhcmlzb24gc2FtcGxlIHR5cGVzIE9MSU5LLXBsYXRmb3JtCgpXZSBwZXJmb3JtZWQgYSBwaWxvdCBleHBlcmltZW50IGNvbXBhcmluZyBwbGFzbWEgYW5kIHBsYXF1ZS1kZXJpdmVkIHByb3RlaW4gbGV2ZWxzIGFzIG1lYXN1cmVkIHVzaW5nIHRoZSBPTElOSyBwbGF0Zm9ybS4KCk15IGNvbGxlYWd1ZSwgQXJqYW4gQm9sdGplcywgYW5hbHl6ZWQgdGhpcy4gQmVsb3cgc29tZSBncmFwaHMgYW5kIHNvbWUgc3RhdGlzdGljcy4gCgpfZXN0aW1hdGVfOiAgICAtMC4wMDA0MDkzODA5Cl9zdGF0aXN0aWNfOiAgIC0wLjAwMzc3NDMwNgpfcC52YWx1ZV86ICAgICAwLjk5Njk5NzQKX3BhcmFtZXRlcl86ICAgODUKX2NvbmYubG93XzogICAgLTAuMjExMDM5NApfY29uZi5oaWdoXzogICAwLjIxMDI1NwkKX21ldGhvZF86ICAgICAgUGVhcnNvbidzIHByb2R1Y3QtbW9tZW50IGNvcnJlbGF0aW9uCQpfYWx0ZXJuYXRpdmU6XyB0d28uc2lkZWQKCioqRmlndXJlIDE6IERpc3RyaWJ1dGlvbnMgb2YgcGxhcXVlIGFuZCBwbGFzbWEgTUNQMSBsZXZlbHMuKiogTWVhc3VyZWQgdXNpbmcgdGhlIE9MSU5LLXBsYXRmb3JtIChDVkQtSUlJIHBhbmVsKS4gUGlsb3QgZXhwZXJpbWVudCB3aXRoIG4gPSA4OCBzYW1wbGVzLiAKIVtEaXN0cmlidXRpb25zIHBsYXF1ZSBhbmQgcGxhc21hIE1DUDEgbGV2ZWxzXShwbGFzbWFfdnNfYnVsa19PTElOS19NQ1AxL2ZpZ3VyZXMvaGlzdF9vbGluay0yLnBuZykKCioqRmlndXJlIDI6IENvbXBhcmlzb24gb2YgcGxhcXVlIGFuZCBwbGFzbWEgTUNQMSBsZXZlbHMuKiogTWVhc3VyZWQgdXNpbmcgdGhlIE9MSU5LLXBsYXRmb3JtIChDVkQtSUlJIHBhbmVsKS4gUGlsb3QgZXhwZXJpbWVudCB3aXRoIG4gPSA4OCBzYW1wbGVzLiBfQVVfID0gQXJiaXRyYXJ5IHVuaXQuCiFbQ29tcGFyaW5nIHBsYXF1ZSBhbmQgcGxhc21hIE1DUDEgbGV2ZWxzIChBVSldKHBsYXNtYV92c19idWxrX09MSU5LX01DUDEvZmlndXJlcy9jb3JyX29saW5rLTEucG5nKQoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjEyCiAgICBMYXN0IHVwZGF0ZTogIDIwMjAtMDctMDYKICAgIFdyaXR0ZW4gYnk6ICAgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiAocy53LnZhbmRlcmxhYW4tMlthdF11bWN1dHJlY2h0Lm5sKS4KICAgIERlc2NyaXB0aW9uOiAgU2NyaXB0IHRvIGFuYWx5c2UgTUNQMSBmcm9tIHRoZSBBdGhlci1FeHByZXNzIEJpb2JhbmsgU3R1ZHkuCiAgICBNaW5pbXVtIHJlcXVpcmVtZW50czogUiB2ZXJzaW9uIDMuNS4yICgyMDE4LTEyLTIwKSAtLSAnRWdnc2hlbGwgSWdsb28nLCBtYWNPUyBNb2phdmUgKDEwLjE0LjIpLgogICAgCiAgICAqKk1vU0NvVyBUby1EbyBMaXN0KioKICAgIFRoZSB0aGluZ3Mgd2UgTXVzdCwgU2hvdWxkLCBDb3VsZCwgYW5kIFdvdWxkIGhhdmUgZ2l2ZW4gdGhlIHRpbWUgd2UgaGF2ZS4KICAgIF9NXwogICAgKiBBU0FQIC0gYW5hbHlzaXMgb24gcGxhc21hIGJhc2VkIG9uIE9MSU5LIHBsYXRmb3JtCiAgICAqIERPTkUgLSBhbmFseXNpcyBvbiB0aGUgcGlsb3QgZGF0YXNldCBvbiB0aGUgT0xJTksgcGxhdGZvcm0sIGNvbXBhcmluZyBwbGFzbWEgdnMuIHBsYXF1ZQogICAgKiBET05FIC0gbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzIChtb2RlbCAxIGFuZCBtb2RlbCAyKSBvZiBgTUNQMV9wZ191Z18yMDE1YCB3aXRoIGN5dG9raW5lcwogICAgKiBET05FIC0gY2hlY2sgb3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1lYXN1cmVtZW5zIG9mIGBNQ1AxYCBhbmQgYE1DUDFfcGdfdWdfMjAxNWAgPiBgTUNQMV9wZ191Z18yMDE1YCBhbmQgYE1DUDFfcGdfbWxfMjAxNWAgZ2l2ZSBzaW1pbGFyIHJlc3VsdHMsIGBNQ1AxX3BnX3VnXzIwMTVgIGlzIG1vcmUgY29ycmVjdCBhcyB0aGlzIGlzIGNvcnJlY3RlZCBmb3IgdGhlIHRvdGFsIGFtb3VudCBvZiBwcm90ZWluIGluIHRoZSBwcm90ZWluLXNhbXBsZSB1c2VkIGZvciB0aGUgbWVhc3VyZW1lbnQuIAogICAgKiBET05FIC0gZG91YmxlIGNoZWNrIHRoZSBwbG90dGluZyBvZiB0aGUgTUFDRQogICAgKiBET05FIC0gYWRkIHRoZSBzdGF0aXN0aWNzIGZvciB0aGUgY29ycmVsYXRpb24gb2YgYE1DUDFfcGdfdWdfMjAxNWAgd2l0aCB0aGUgY3l0b2tpbmVzCiAgICAqIERPTkUgLSBhZGQgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBgTUNQMWAsIGBNQ1AxX3BnX21sXzIwMTVgLCBhbmQgYE1DUDFfcGdfdWdfMjAxNWAKICAgICogRE9ORSAtIGFuYWx5c2lzIGluIHRoZSBjb250ZXh0IG9mIHllYXIgb2Ygc3VyZ2VyeSBnaXZlbiBWYW4gTGFtbWVyZW4gX2V0IGFsLl8gCiAgICAqIERPTkUgLSBhZGQgYW5hbHlzaXMgb24gdnVsbmVyYWJpbGl0eSBpbmRleAogICAgKiBET05FIC0gYWRkIGFuYWx5c2lzIG9uIGJpbmFyeSBhbmQgb3JkaW5hbCBwbGFxdWUgcGhlbm90eXBlcwogICAgKiBET05FIC0gYWRkIGJveHBsb3RzIG9mIE1DUDEgbGV2ZWxzIHN0cmF0aWZpZWQgYnkgY29uZm91bmRlcnMvdmFyaWFibGVzCiAgICAKICAgIF9TXwogICAgKiBET05FIHByZXR0aWZ5IGZvcmVzdCBwbG90CiAgICAKICAgIF9DXwogICAgCiAgICAKICAgIF9XXwogICAgCiAgICAKICAgICoqQ2hhbmdlcyBsb2cqKgogICAgKiB2MS4wLjEyIEFkZCBib3hwbG90cyBvZiBNQ1AxIGxldmVscyBzdHJhdGlmaWVkIGJ5IGNvbmZvdW5kZXIvdmFyaWFibGVzLgogICAgKiB2MS4wLjExIEFkZCBhbmFseXNpcyBvZiBwaWxvdCBkYXRhIGNvbXBhcmluZyBPTElOSy1wbGF0Zm9ybSBiYXNlZCBNQ1AxIGxldmVscyBpbiBwbGFzbWEgYW5kIHBsYXF1ZS4KICAgICogdjEuMC4xMCBBZGQgYW5hbHlzZXMgZm9yIGFsbCB0aHJlZSBgTUNQMWAsIGBNQ1AxX3BnX21sXzIwMTVgLCBhbmQgYE1DUDFfcGdfdWdfMjAxNWAuIEFkZCBjb21wYXJpc29uIGJldHdlZW4gYE1DUDFgLCBgTUNQMV9wZ19tbF8yMDE1YCwgYW5kIGBNQ1AxX3BnX3VnXzIwMTVgLiBBZGQgKGFuZCBmaXhlZCkgb3JkaW5hbCByZWdyZXNzaW9uLiBEb3VibGUgY2hlY2tlZCB3aGljaCBtZWFzdXJlbWVudCB0byB1c2UuIAogICAgKiB2MS4wLjkgQWRkZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzIGZvciBNQ1AxIHZzLiBjeXRva2luZXMgcGxhcXVlIGxldmVscy4gRG91YmxlIGNoZWNrZWQgdXBsb2FkIG9mIE1BQ0UtcGxvdHMuIEFkZGVkIHN0YXRpc3RpY3MgZnJvbSBjb3JyZWxhdGlvbiAoaGVhdG1hcCkgdG8gdHh0LWZpbGUuCiAgICAqIHYxLjAuOCBGaXhlZCBlcnJvciBpbiBNQ1AxIHBsYXNtYSBhbmFseXNpcy4gSXQgdHVybnMgb3V0IHRoZSBgTUNQMWAgYW5kIGBNQ1AxX3BnX3VnXzIwMTVgIHZhcmlhYmxlcyBhcmUgX2JvdGhfIG1lYXN1cmVkIGluIHBsYXF1ZSwgaW4gdHdvIHNlcGFyYXRlIGV4cGVyaW1lbnRzLCBleHAuIG5vLiAxIGFuZCBleHAuIG5vLiAyLCByZXNwZWN0aXZlbHkuIAogICAgKiB2MS4wLjcgRml4ZWQgdGhlIHBlciBBZ2UtZ3JvdXAgTUNQMSBCb3ggcGxvdHMuIEFkZGVkIGNvcnJlbGF0aW9ucyB3aXRoIG90aGVyIGN5dG9raW5lcyBpbiBwbGFxdWVzLgogICAgKiB2MS4wLjYgT25seSBhbmFseXNlcyBhbmQgZmlndXJlcyB0aGF0IGVuZCB1cCBpbiB0aGUgZmluYWwgbWFudXNjcmlwdC4KICAgICogdjEuMC41IFVwZGF0ZSB3aXRoIDMwLSBhbmQgOTAtZGF5cyBzdXJ2aXZhbC4KICAgICogdjEuMC40IFVwZGF0ZWQgd2l0aCBDb3gtcmVncmVzc2lvbnMuCiAgICAqIHYxLjAuMyBJbmNsdWRlZCBtb3JlIG1vZGVscy4KICAgICogdjEuMC4yIEJ1Z3MgZml4ZWQuCiAgICAqIHYxLjAuMSBFeHRlbmRlZCB3aXRoIGxpbmVhciBhbmQgbG9naXN0aWMgcmVncmVzc2lvbnMuCiAgICAqIHYxLjAuMCBJbml0YWwgdmVyc2lvbi4KICAgIAoKLS0tLS0tCgpgYGB7ciBldmFsID0gVFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGAKCiMgU2F2aW5nIGVudmlyb25tZW50CmBgYHtyIFNhdmluZ30Kc2F2ZS5pbWFnZShwYXN0ZTAoUFJPSkVDVF9sb2MsICIvIixUb2RheSwiLiIsUFJPSkVDVE5BTUUsIi5zYW1wbGVfc2VsZWN0aW9uLlJEYXRhIikpCmBgYAoKLS0tLS0tCjxzdXA+JmNvcHk7IDE5NzktMjAyMCBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIHwgcy53LnZhbmRlcmxhYW4tMlthdF11bWN1dHJlY2h0Lm5sIHwgW3N3dmFuZGVybGFhbi5naXRodWIuaW9dKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykuPC9zdXA+Ci0tLS0tLQoK